]> pd.if.org Git - pccts/commitdiff
auto commit for import
authorTerence Parr <>
Fri, 6 Oct 1995 00:40:08 +0000 (19:40 -0500)
committerNathan Wagner <nw@hydaspes.if.org>
Sun, 26 Feb 2017 02:16:53 +0000 (20:16 -0600)
dlg/dlg.1 [new file with mode: 0755]
dlg/dlg.mpw.r [new file with mode: 0755]
dlg/dlg1.txt [new file with mode: 0755]
dlg/makefile.VMS [new file with mode: 0755]
dlg/makefile.mpw [new file with mode: 0755]
dlg/watdlg.mak [new file with mode: 0755]
h/antlr.h [new file with mode: 0755]
h/ast.h [new file with mode: 0755]
h/charptr.h [new file with mode: 0755]
h/dlgauto.h [new file with mode: 0755]
h/err.h [new file with mode: 0755]

diff --git a/dlg/dlg.1 b/dlg/dlg.1
new file mode 100755 (executable)
index 0000000..3a1694e
--- /dev/null
+++ b/dlg/dlg.1
@@ -0,0 +1,79 @@
+.TH dlg 1 "April 1994" "DLG" "PCCTS Manual Pages"
+.SH NAME
+dlg \- DFA Lexical Analyzer Generator
+.SH SYNTAX
+.LP
+\fBdlg\fR [\fIoptions\fR] \fIlexical_spec\fR [\fIoutput_file\fR]
+.SH DESCRIPTION
+.B dlg
+is a tool that produces fast deterministic finite automata for recognizing
+regular expressions in input.
+.SH OPTIONS
+.IP "\fB-CC\fR"
+Generate C++ output.  The \fIoutput_file\fP is not specified in this
+case.
+.IP "\fB-C\fR[\fP level\fR]
+Where \fPlevel\fR is the compression level used.  0 indications no
+compression, 1 removes all unused characters from the transition from table,
+and 2 maps equivalent characters into the same character classes.  It is
+suggested that level -C2 is used, since it will significantly reduce the size
+of the dfa produced for lexical analyzer.
+.IP "\fB-m\fP
+Produces the header file for the lexical mode with a name other than
+the default name of "mode.h".
+.IP \fB-i\fP
+An interactive, or as interactive as possible, parser is produced.  A character
+is only obtained when required to decide which state to go to.  Some care
+must be taken to obtain accept states that do not require look ahead at the
+next character to determine if that is the stop state.  Any regular expression
+with a Kleene closure at the end is guaranteed to require another character
+of look ahead.
+.IP "\fB-cl\fP class
+Specify a class name for DLG to generate.  The default is DLGLexer.
+'class' will be a subclass of DLGLexerBase; only used for -CC.
+.IP \fB-ci\fP
+The automaton will treat upper and lower case characters identically.
+This is accomplished in the automaton; the characters in the lexical
+buffer are unmodified.
+.IP \fB-cs\fP
+Upper and lower case characters are treated as distinct.  This is the
+default.
+.IP "\fB-o\fP dir
+Directory where output files should go (default=".").  This is very
+nice for keeping the source directory clear of ANTLR and DLG spawn.
+.IP \fB-Wambiguity\fP
+Warns if more than one regular expression could match the same character
+sequence.  The warnings give the numbers of the expressions in the dlg
+lexical specification file.  The numbering of the expressions starts at one.
+Multiple warnings may be print for the same expressions.
+.IP \-
+Used in place of file names to get input from standard in or send output
+to standard out.
+.SH "SPECIAL CONSIDERATIONS"
+.PP
+\fIDlg\fP works...  we think.  There is no implicit guarantee of
+anything.  We reserve no \fBlegal\fP rights to the software known as
+the Purdue Compiler Construction Tool Set (PCCTS) \(em PCCTS is in the
+public domain.  An individual or company may do whatever they wish
+with source code distributed with PCCTS or the code generated by
+PCCTS, including the incorporation of PCCTS, or its output, into
+commercial software.  We encourage users to develop software with
+PCCTS.  However, we do ask that credit is given to us for developing
+PCCTS.  By "credit", we mean that if you incorporate our source code
+into one of your programs (commercial product, research project, or
+otherwise) that you acknowledge this fact somewhere in the
+documentation, research report, etc...  If you like PCCTS and have
+developed a nice tool with the output, please mention that you
+developed it using PCCTS.  As long as these guidelines are followed, we
+expect to continue enhancing this system and expect to make other
+tools available as they are completed.
+.SH FILES
+.B mode.h
+,
+.B dlgauto.h
+,
+.B dlgdef.h
+.SH SEE ALSO
+.BR antlr (1),
+.BR pccts (1)
+.SH BUGS
diff --git a/dlg/dlg.mpw.r b/dlg/dlg.mpw.r
new file mode 100755 (executable)
index 0000000..0074064
--- /dev/null
@@ -0,0 +1,170 @@
+#include "cmdo.r"
+resource 'cmdo' (128, "Dlg") {
+       {
+               295,
+               "DLG -- Purdue Compiler Construction Tool Set (PCCTS)"
+               " lexical analyzer generator.",
+               {
+                       /* [1] */
+                       NotDependent { }, CheckOption {
+                               NotSet,
+                               {35, 175, 50, 225},
+                               "On",
+                               "-CC",
+                               "When this control is checked, DLG generates"
+                               " a scanner using C++ classes rather"
+                               " than C functions."
+                       },
+                       /* [2] */
+                       Or{{1}}, RegularEntry {
+                               "Lexer Class Name:",
+                               {35, 225, 50, 355},
+                               {35, 355, 51, 450},
+                               "DLGLexer",
+                               keepCase,
+                               "-cl",
+                               "This entry specifies the name DLG uses for "
+                               "the C++ lexer class."
+                       },
+                       /* [3] */
+                       NotDependent { }, TextBox {
+                               gray,
+                               { 25, 165, 60, 460 },
+                               "C++ Code Generation"
+                       },
+                       /* [4] */
+                       NotDependent { }, Files {
+                               InputFile,
+                               RequiredFile {
+                                       {40, 25, 59, 135},
+                                       "Input FileI",
+                                       "",
+                                       "Choose the lexical description file for DLG to process."
+                               },
+                               Additional {
+                                       "",
+                                       "",
+                                       "",
+                                       "",
+                                       {       /* array TypesArray: 1 elements */
+                                               /* [1] */
+                                               text
+                                       }
+                               }
+                       },
+                       /* [5] */
+                       Or {{-1}}, Files {
+                               OutputFile,
+                               RequiredFile {
+                                       {83, 25, 102, 135},
+                                       "Output FileI",
+                                       "",
+                                       "Choose the name of the file that will hold the DLG-produced scanner."
+                               },
+                               NoMore { }
+                       },
+                       /* [6] */
+                       Or { {1,5} }, Dummy { },
+                       /* [7] */
+                       NotDependent { }, Redirection {
+                               DiagnosticOutput,
+                               { 115, 25 }
+                       },
+                       /* [8] */
+                       NotDependent { }, TextBox {
+                               gray,
+                               { 25, 20, 156, 145 },
+                               "Files"
+                       },
+                       /* [9] */
+                       NotDependent { }, Files {
+                               DirOnly,
+                               OptionalFile {
+                                       {68, 175, 84, 305},
+                                       {88, 175, 107, 305},
+                                       "Output Directory",
+                                       ":",
+                                       "-o",
+                                       "",
+                                       "Choose the directory where DLG will put "
+                                       "its output.",
+                                       dim,
+                                       "Output DirectoryI",
+                                       "",
+                                       ""
+                               },
+                               NoMore { }
+
+                       },
+                       /* [10] */
+                       NotDependent { }, RegularEntry {
+                               "Mode File Name:",
+                               {68, 315, 83, 450},
+                               {88, 315, 104, 450},
+                               "mode.h",
+                               keepCase,
+                               "-m",
+                               "This entry specifies the name DLG uses for "
+                               "its lexical mode output file."
+                       },
+                       /* [11] */
+                       NotDependent { }, RadioButtons {
+                               {       /* array radioArray: 3 elements */
+                                       /* [1] */
+                                       {134, 175, 149, 255}, "None", "", Set, "When this option is selected, DLG "
+                                       "will not compress its tables.",
+                                       /* [2] */
+                                       {134, 265, 149, 345}, "Level 1", "-C1", NotSet, "When this option is selected, DLG "
+                                       "will remove all unused characters from the transition-from table.",
+                                       /* [3] */
+                                       {134, 360, 149, 450}, "Level 2", "-C2", NotSet, "When this option is selected, DLG "
+                                       "will perform level 1 compression plus it will map "
+                                        "equivalent characters into the same character classes."
+                               }
+                       },
+                       /* [12] */
+                       NotDependent { }, TextBox {
+                               gray,
+                               { 124, 165, 156, 460 },
+                               "Table Compression"
+                       },
+                       /* [13] */
+                       NotDependent { }, CheckOption {
+                               Set,
+                               {165, 20, 180, 145},
+                               "Case Sensitive",
+                               "-ci",
+                               "When this control is checked, the DLG automaton will "
+                               "treat upper and lower case characters identically."
+                       },
+                       /* [14] */
+                       NotDependent { }, CheckOption {
+                               NotSet,
+                               {165, 150, 180, 300},
+                               "Interactive Scanner",
+                               "-i",
+                               "When this control is checked, DLG will "
+                               "generate as interactive a scanner as possible."
+                       },
+                       /* [15] */
+                       NotDependent { }, CheckOption {
+                               NotSet,
+                               {165, 310, 180, 460},
+                               "Ambiguity Warnings",
+                               "-Wambiguity",
+                               "When this control is checked, DLG warns if more "
+                               "than one regular expression could match the same character sequence."
+                       },
+                       /* [16] */
+                       NotDependent { }, VersionDialog {
+                               VersionString { "1.33" },
+                               "PCCTS was written by Terence Parr, Russell Quong, Will Cohen, and Hank Dietz: 1989-1995."
+                               " MPW port by Scott Haney.",
+                               0
+                       },
+                       /* [17] */
+                       And { {4,6} }, DoItButton { }
+               }
+       }
+};
+
diff --git a/dlg/dlg1.txt b/dlg/dlg1.txt
new file mode 100755 (executable)
index 0000000..79f6690
--- /dev/null
@@ -0,0 +1,132 @@
+
+
+
+dlg(1)                 PCCTS Manual Pages                  dlg(1)
+
+
+
+NAME
+     dlg - DFA Lexical Analyzer Generator
+
+SYNTAX
+     dlg [_\bo_\bp_\bt_\bi_\bo_\bn_\bs] _\bl_\be_\bx_\bi_\bc_\ba_\bl__\bs_\bp_\be_\bc [_\bo_\bu_\bt_\bp_\bu_\bt__\bf_\bi_\bl_\be]
+
+DESCRIPTION
+     dlg is a tool that produces fast deterministic finite auto-
+     mata for recognizing regular expressions in input.
+
+OPTIONS
+     -CC  Generate C++ output.  The _\bo_\bu_\bt_\bp_\bu_\bt__\bf_\bi_\bl_\be is not specified
+          in this case.
+
+     -C[ level]
+          Where level is the compression level used.  0 indica-
+          tions no compression, 1 removes all unused characters
+          from the transition from table, and 2 maps equivalent
+          characters into the same character classes.  It is sug-
+          gested that level -C2 is used, since it will signifi-
+          cantly reduce the size of the dfa produced for lexical
+          analyzer.
+
+     -m   Produces the header file for the lexical mode with a
+          name other than the default name of "mode.h".
+
+     -i   An interactive, or as interactive as possible, parser
+          is produced.  A character is only obtained when
+          required to decide which state to go to.  Some care
+          must be taken to obtain accept states that do not
+          require look ahead at the next character to determine
+          if that is the stop state.  Any regular expression with
+          a Kleene closure at the end is guaranteed to require
+          another character of look ahead.
+
+     -cl class
+          Specify a class name for DLG to generate.  The default
+          is DLGLexer.
+
+     -ci  The automaton will treat upper and lower case charac-
+          ters identically.  This is accomplished in the automa-
+          ton; the characters in the lexical buffer are unmodi-
+          fied.
+
+     -cs  Upper and lower case characters are treated as dis-
+          tinct.  This is the default.
+
+     -o dir
+          Directory where output files should go (default=".").
+          This is very nice for keeping the source directory
+          clear of ANTLR and DLG spawn.
+
+     -Wambiguity
+          Warns if more than one regular expression could match
+          the same character sequence.  The warnings give the
+          numbers of the expressions in the dlg lexical specifi-
+          cation file.  The numbering of the expressions starts
+          at one.  Multiple warnings may be print for the same
+          expressions.
+
+     -    Used in place of file names to get input from standard
+          in or send output to standard out.
+
+SPECIAL CONSIDERATIONS
+     _\bD_\bl_\bg works...  we think.  There is no implicit guarantee of
+     anything.  We reserve no legal rights to the software known
+     as the Purdue Compiler Construction Tool Set (PCCTS) - PCCTS
+     is in the public domain.  An individual or company may do
+     whatever they wish with source code distributed with PCCTS
+     or the code generated by PCCTS, including the incorporation
+     of PCCTS, or its output, into commercial software.  We
+     encourage users to develop software with PCCTS.  However, we
+     do ask that credit is given to us for developing PCCTS.  By
+     "credit", we mean that if you incorporate our source code
+     into one of your programs (commercial product, research pro-
+     ject, or otherwise) that you acknowledge this fact somewhere
+     in the documentation, research report, etc...  If you like
+     PCCTS and have developed a nice tool with the output, please
+     mention that you developed it using PCCTS.  As long as these
+     guidelines are followed, we expect to continue enhancing
+     this system and expect to make other tools available as they
+     are completed.
+
+FILES
+     mode.h , dlgauto.h , dlgdef.h
+
+SEE ALSO
+     antlr(1), pccts(1)
+
+BUGS
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dlg/makefile.VMS b/dlg/makefile.VMS
new file mode 100755 (executable)
index 0000000..1fd5a2f
--- /dev/null
@@ -0,0 +1,36 @@
+$! File: MAKE.COM - Makefile for DLG 1.33
+$!
+$! History:
+$! ---------
+$! 20-Mar-1992  Fred Scholldorf         Hacked together for VAX/VMS.
+$! 24-Mar-1992  Fred Scholldorf         LINK against VAXCRTL sharable library.
+$! 24-Aug-1993  Fred Scholldorf         Upgrade for PCCTS V1.10.
+$!
+$ set noon      !Don't stop on errors.
+$!
+$ if P1 .eqs. "LINK" then goto relink
+$!
+$ define pccts_h "[-.h]"
+$ define support_set "[-.support.set]"
+$!
+$ delete/nolog *.obj;*  !Get rid of existing .OBJ files.
+$!
+$ options = "/INCLUDE=(pccts_h,support_set)"
+$ CC 'options' dlg_a
+$ CC 'options' dlg_p
+$ CC 'options' err
+$ CC 'options' main
+$ CC 'options' [-.support.set]set
+$ CC 'options' support 
+$ CC 'options' output
+$ CC 'options' relabel 
+$ CC 'options' automata
+$!
+$relink:
+$ LINK  /EXE=dlg.exe    -
+       dlg_a,dlg_p,err,main,   -
+       set,support,output,     -
+       relabel,automata,       -
+       sys$input:/options
+       sys$share:vaxcrtl.exe/share
+$ EXIT
diff --git a/dlg/makefile.mpw b/dlg/makefile.mpw
new file mode 100755 (executable)
index 0000000..eba6c25
--- /dev/null
@@ -0,0 +1,74 @@
+#//////////////////////////////////////////////////////////////////////////
+#//
+#// FILE NAME
+#//    dlg.make
+#//
+#// AUTHOR
+#//    Scott Haney
+#//
+#// CREATED
+#//    May 29, 1994
+#//
+#// DESCRIPTION
+#//    Controls Macintosh builds of DLG.
+#//
+#//////////////////////////////////////////////////////////////////////////
+
+ObjDir = :Macintosh:
+SetDir = ::support:set
+
+COptions = -mc68020 -model far -warnings off -d MPW -d __STDC__=1 -d USER_ZZSYN Â¶
+  -i {SetDir} -i ::h
+LinkOptions = -d -c 'MPS ' -t MPST -mf -model far -br ON -srtsg ALL
+
+Objects = Â¶
+       {ObjDir}automata.c.o Â¶
+       {ObjDir}dlg_a.c.o Â¶
+       {ObjDir}dlg_p.c.o Â¶
+       {ObjDir}err.c.o Â¶
+       {ObjDir}main.c.o Â¶
+       {ObjDir}output.c.o Â¶
+       {ObjDir}relabel.c.o Â¶
+       {ObjDir}support.c.o Â¶
+       {SetDir}{ObjDir}set.c.o Â¶
+       "{CLibraries}"StdCLib.o Â¶
+       "{Libraries}"Stubs.o Â¶
+       "{Libraries}"Runtime.o Â¶
+       "{Libraries}"Interface.o Â¶
+       "{Libraries}"ToolLibs.o Â¶
+
+{ObjDir}automata.c.o Ã„ automata.c
+
+{ObjDir}dlg_a.c.o Ã„ dlg_a.c
+
+{ObjDir}dlg_p.c.o Ã„ dlg_p.c
+
+{ObjDir}err.c.o Ã„ err.c
+
+{ObjDir}main.c.o Ã„ main.c
+
+{ObjDir}output.c.o Ã„ output.c
+
+{ObjDir}relabel.c.o Ã„ relabel.c
+
+{ObjDir}support.c.o Ã„ support.c
+
+{SetDir}{ObjDir}set.c.o Ã„ {SetDir}:set.c
+
+{SetDir}{ObjDir} Ã„ {SetDir}:
+{ObjDir} Ã„ :
+{ObjDir} Ã„ {ObjDir}
+
+
+dlg Ã„Ä {Objects}
+       Link {LinkOptions} -o dlg {Objects}
+
+dlg Ã„Ä dlg.r
+       Rez dlg.r -o dlg -a
+
+Bootstrap Ã„ dlg_p.g
+       antlr dlg_p.g
+       dlg -C2 parser.dlg dlg_a.c
+
+Install  Ã„ dlg
+       Duplicate dlg "{MPW}"Tools:dlg
diff --git a/dlg/watdlg.mak b/dlg/watdlg.mak
new file mode 100755 (executable)
index 0000000..b4ab185
--- /dev/null
@@ -0,0 +1,47 @@
+SET=..\support\set\r
+PCCTS_H=..\h\r
+\r
+#\r
+#   Watcom\r
+#\r
+CC=wcl386\r
+ANTLR=..\bin\antlr\r
+DLG=..\bin\dlg\r
+CFLAGS= -I. -I$(SET) -I$(PCCTS_H) -DUSER_ZZSYN -DPC\r
+LIBS=\r
+OBJ_EXT = obj\r
+LINK = wcl386\r
+\r
+.c.obj :\r
+       $(CC) -c $[* $(CFLAGS)\r
+\r
+dlg.exe : dlg_p.obj dlg_a.obj main.obj err.obj set.obj support.obj &\r
+       output.obj relabel.obj automata.obj\r
+       $(LINK) -fe=dlg.exe *.obj -k14336\r
+       copy *.exe ..\bin\r
+\r
+SRC = dlg_p.c dlg_a.c main.c err.c $(SET)\set.c support.c output.c &\r
+       relabel.c automata.c\r
+\r
+dlg_p.c parser.dlg err.c tokens.h : dlg_p.g\r
+       $(ANTLR) dlg_p.g\r
+\r
+dlg_a.c mode.h : parser.dlg\r
+       $(DLG) -C2 parser.dlg dlg_a.c\r
+\r
+dlg_p.$(OBJ_EXT) : dlg_p.c dlg.h tokens.h mode.h\r
+       $(CC) $(CFLAGS) -c dlg_p.c\r
+\r
+dlg_a.$(OBJ_EXT) : dlg_a.c dlg.h tokens.h mode.h\r
+       $(CC) $(CFLAGS) -c dlg_a.c\r
+\r
+main.$(OBJ_EXT) : main.c dlg.h\r
+       $(CC) $(CFLAGS) -c main.c\r
+\r
+set.$(OBJ_EXT) : $(SET)\set.c\r
+       $(CC) -c $(CFLAGS) $(SET)\set.c\r
+\r
+#clean up all the intermediate files\r
+clean:\r
+       del *.$(OBJ_EXT)\r
+\1aEOF_watdlg.mak
diff --git a/h/antlr.h b/h/antlr.h
new file mode 100755 (executable)
index 0000000..907cd87
--- /dev/null
+++ b/h/antlr.h
@@ -0,0 +1,625 @@
+/* antlr.h
+ *
+ * SOFTWARE RIGHTS
+ *
+ * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
+ * Set (PCCTS) -- PCCTS is in the public domain.  An individual or
+ * company may do whatever they wish with source code distributed with
+ * PCCTS or the code generated by PCCTS, including the incorporation of
+ * PCCTS, or its output, into commerical software.
+ * 
+ * We encourage users to develop software with PCCTS.  However, we do ask
+ * that credit is given to us for developing PCCTS.  By "credit",
+ * we mean that if you incorporate our source code into one of your
+ * programs (commercial product, research project, or otherwise) that you
+ * acknowledge this fact somewhere in the documentation, research report,
+ * etc...  If you like PCCTS and have developed a nice tool with the
+ * output, please mention that you developed it using PCCTS.  In
+ * addition, we ask that this header remain intact in our source code.
+ * As long as these guidelines are kept, we expect to continue enhancing
+ * this system and expect to make other tools available as they are
+ * completed.
+ *
+ * ANTLR 1.33
+ * Terence Parr
+ * Parr Research Corporation
+ * with Purdue University and AHPCRC, University of Minnesota
+ * 1989-1995
+ */
+#ifndef ANTLR_H
+#define ANTLR_H
+
+#include "config.h"
+
+/*
+ * Define all of the stack setup and manipulation of $i, #i variables.
+ *
+ *     Notes:
+ *             The type 'Attrib' must be defined before entry into this .h file.
+ */
+
+#ifdef __USE_PROTOS
+#include <stdlib.h>
+#else
+#ifdef VAXC
+#include <stdlib.h>
+#else
+#include <malloc.h>
+#endif
+#endif
+#include <string.h>
+
+typedef int ANTLRTokenType;
+typedef unsigned char SetWordType;
+
+typedef char ANTLRChar;
+
+                                               /* G u e s s  S t u f f */
+
+#ifdef ZZCAN_GUESS
+#ifndef ZZINF_LOOK
+#define ZZINF_LOOK
+#endif
+#endif
+
+#ifdef ZZCAN_GUESS
+typedef struct _zzjmp_buf {
+                       jmp_buf state;
+               } zzjmp_buf;
+#endif
+
+
+/* can make this a power of 2 for more efficient lookup */
+#ifndef ZZLEXBUFSIZE
+#define ZZLEXBUFSIZE   2000
+#endif
+
+#define zzOvfChk                                                                                                               \
+            if ( zzasp <= 0 )                                           \
+            {                                                           \
+                fprintf(stderr, zzStackOvfMsg, __FILE__, __LINE__);            \
+                exit(PCCTS_EXIT_FAILURE);                                               \
+            }
+
+#ifndef ZZA_STACKSIZE
+#define ZZA_STACKSIZE  400
+#endif
+#ifndef ZZAST_STACKSIZE
+#define ZZAST_STACKSIZE        400
+#endif
+
+#ifndef zzfailed_pred
+#define zzfailed_pred(_p)      \
+       fprintf(stderr, "semantic error; failed predicate: '%s'\n",_p)
+#endif
+
+#ifdef LL_K
+#define LOOKAHEAD                                                                                              \
+       int zztokenLA[LL_K];                                                                            \
+       char zztextLA[LL_K][ZZLEXBUFSIZE];                                                      \
+       int zzlap = 0, zzlabase=0; /* labase only used for DEMAND_LOOK */
+#else
+#define LOOKAHEAD                                                                                              \
+       int zztoken;
+#endif
+
+#ifndef zzcr_ast
+#define zzcr_ast(ast,attr,tok,text)
+#endif
+
+#ifdef DEMAND_LOOK
+#define DemandLookData  int zzdirty=1;
+#else
+#define DemandLookData
+#endif
+
+                                               /* S t a t e  S t u f f */
+
+#ifdef ZZCAN_GUESS
+#define zzGUESS_BLOCK          zzantlr_state zzst; int zzrv;
+#define zzGUESS                                zzsave_antlr_state(&zzst); \
+                                                       zzguessing = 1; \
+                                                       zzrv = setjmp(zzguess_start.state);
+#define zzGUESS_FAIL           longjmp(zzguess_start.state, 1)
+#define zzGUESS_DONE           zzrestore_antlr_state(&zzst);
+#define zzNON_GUESS_MODE       if ( !zzguessing )
+#define zzGuessData                                     \
+            zzjmp_buf zzguess_start;                    \
+            int zzguessing;
+#else
+#define zzGUESS_BLOCK
+#define zzGUESS
+#define zzGUESS_FAIL
+#define zzGUESS_DONE
+#define zzNON_GUESS_MODE
+#define zzGuessData
+#endif
+
+typedef struct _zzantlr_state {
+#ifdef ZZCAN_GUESS
+                       zzjmp_buf guess_start;
+                       int guessing;
+#endif
+                       int asp;
+                       int ast_sp;
+#ifdef ZZINF_LOOK
+                       int inf_lap;    /* not sure we need to save this one */
+                       int inf_labase;
+                       int inf_last;
+#endif
+#ifdef DEMAND_LOOK
+                       int dirty;
+#endif
+
+#ifdef LL_K
+                       int tokenLA[LL_K];
+                       char textLA[LL_K][ZZLEXBUFSIZE];
+                       int lap;
+                       int labase;
+#else
+                       int token;
+                       char text[ZZLEXBUFSIZE];
+#endif
+               } zzantlr_state;
+
+
+                 /* I n f i n i t e  L o o k a h e a d */
+
+
+#ifdef ZZINF_LOOK
+#define InfLookData    \
+       int *zzinf_tokens;      \
+       char **zzinf_text;      \
+       char *zzinf_text_buffer;        \
+       int *zzinf_line;        \
+       int zzinf_labase;       \
+       int zzinf_last;
+#else
+#define InfLookData
+#endif
+
+#ifdef ZZINF_LOOK
+
+#ifndef ZZINF_DEF_TEXT_BUFFER_SIZE
+#define ZZINF_DEF_TEXT_BUFFER_SIZE         20000
+#endif
+#ifndef ZZINF_DEF_TOKEN_BUFFER_SIZE
+#define ZZINF_DEF_TOKEN_BUFFER_SIZE        2000
+#endif
+/* WARNING!!!!!!
+ * ZZINF_BUFFER_TEXT_CHUNK_SIZE must be > sizeof(text) largest possible token.
+ */
+#ifndef ZZINF_BUFFER_TEXT_CHUNK_SIZE
+#define ZZINF_BUFFER_TEXT_CHUNK_SIZE   5000
+#endif
+#ifndef ZZINF_BUFFER_TOKEN_CHUNK_SIZE
+#define ZZINF_BUFFER_TOKEN_CHUNK_SIZE  1000
+#endif
+
+#if ZZLEXBUFSIZE > ZZINF_BUFFER_TEXT_CHUNK_SIZE
+#define ZZINF_BUFFER_TEXT_CHUNK_SIZE   ZZLEXBUFSIZE+5
+#endif
+
+/* make inf_look user-access macros */
+#ifdef LL_K
+#define ZZINF_LA_VALID(i)      (((zzinf_labase+i-1)-LL_K+1) <= zzinf_last)
+#define ZZINF_LA(i)                    zzinf_tokens[(zzinf_labase+i-1)-LL_K+1]
+#define ZZINF_LATEXT(i)                zzinf_text[(zzinf_labase+i-1)-LL_K+1]
+/* #define ZZINF_LINE(i)       zzinf_line[(zzinf_labase+i-1)-LL_K+1]*/
+#else
+#define ZZINF_LA_VALID(i)      (((zzinf_labase+i-1)) <= zzinf_last)
+#define ZZINF_LA(i)                    zzinf_tokens[(zzinf_labase+i-1)]
+#define ZZINF_LATEXT(i)                zzinf_text[(zzinf_labase+i-1)]
+#endif
+
+#define inf_zzgettok _inf_zzgettok()
+extern void _inf_zzgettok();
+
+#endif /* ZZINF_LOOK */
+
+
+#ifdef LL_K
+
+#ifdef __USE_PROTOS
+#define ANTLR_INFO                                                                                             \
+       Attrib zzempty_attr() {static Attrib a; return a;}                      \
+       Attrib zzconstr_attr(int _tok, char *_text)\
+               {Attrib a; zzcr_attr((&a),_tok,_text); return a;}               \
+       int zzasp=ZZA_STACKSIZE;                                                                        \
+       char zzStackOvfMsg[]="fatal: attrib/AST stack overflow %s(%d)!\n"; \
+       Attrib zzaStack[ZZA_STACKSIZE]; DemandLookData                          \
+       InfLookData                                                 \
+    zzGuessData
+#else
+#define ANTLR_INFO                                                                                             \
+       Attrib zzempty_attr() {static Attrib a; return a;}                      \
+       Attrib zzconstr_attr(_tok, _text) int _tok; char *_text;\
+               {Attrib a; zzcr_attr((&a),_tok,_text); return a;}               \
+       int zzasp=ZZA_STACKSIZE;                                                                        \
+       char zzStackOvfMsg[]="fatal: attrib/AST stack overflow %s(%d)!\n"; \
+       Attrib zzaStack[ZZA_STACKSIZE]; DemandLookData                          \
+       InfLookData                                                 \
+    zzGuessData
+#endif
+
+#else
+
+#ifdef __USE_PROTOS
+#define ANTLR_INFO                                                                                             \
+       Attrib zzempty_attr() {static Attrib a; return a;}                      \
+       Attrib zzconstr_attr(int _tok, char *_text)\
+               {Attrib a; zzcr_attr((&a),_tok,_text); return a;}               \
+       int zzasp=ZZA_STACKSIZE;                                                                        \
+       char zzStackOvfMsg[]="fatal: attrib/AST stack overflow %s(%d)!\n"; \
+       Attrib zzaStack[ZZA_STACKSIZE]; DemandLookData                          \
+       InfLookData                                                 \
+    zzGuessData
+#else
+#define ANTLR_INFO                                                                                             \
+       Attrib zzempty_attr() {static Attrib a; return a;}                      \
+       Attrib zzconstr_attr(_tok, _text) int _tok; char *_text;\
+               {Attrib a; zzcr_attr((&a),_tok,_text); return a;}               \
+       int zzasp=ZZA_STACKSIZE;                                                                        \
+       char zzStackOvfMsg[]="fatal: attrib/AST stack overflow %s(%d)!\n"; \
+       Attrib zzaStack[ZZA_STACKSIZE]; DemandLookData                          \
+       InfLookData                                                 \
+    zzGuessData
+#endif
+       
+#endif /* LL_k */
+
+
+#ifdef ZZINF_LOOK
+
+#ifdef LL_K
+#ifdef DEMAND_LOOK
+#define zzPrimeLookAhead  {zzdirty=LL_K; zzlap = zzlabase = 0;}
+#else
+#define zzPrimeLookAhead  {zzlap = zzlabase = 0; zzfill_inf_look();\
+                                                 {int _i;  for(_i=1;_i<=LL_K; _i++)            \
+                                                                               {zzCONSUME;} zzlap = zzlabase = 0;}}
+#endif
+
+#else /* LL_K */
+
+#ifdef DEMAND_LOOK
+#define zzPrimeLookAhead  zzfill_inf_look(); zzdirty=1
+#else
+#define zzPrimeLookAhead  zzfill_inf_look(); inf_zzgettok
+
+#endif
+#endif /* LL_K */
+
+#else  /* ZZINF_LOOK */
+
+#ifdef LL_K
+#ifdef DEMAND_LOOK
+#define zzPrimeLookAhead  {zzdirty=LL_K; zzlap = zzlabase = 0;}
+#else
+#define zzPrimeLookAhead  {int _i; zzlap = 0; for(_i=1;_i<=LL_K; _i++)         \
+                                                                               {zzCONSUME;} zzlap = 0;}
+#endif
+
+#else
+
+#ifdef DEMAND_LOOK
+#define zzPrimeLookAhead  zzdirty=1
+#else
+#define zzPrimeLookAhead  zzgettok()
+#endif
+#endif /* LL_K */
+
+#endif /* ZZINF_LOOK */
+
+
+#ifdef LL_K
+#define zzenterANTLRs(s)                            \
+        zzlextext = &(zztextLA[0][0]); zzrdstr( s ); zzPrimeLookAhead;
+#define zzenterANTLRf(f)                                                       \
+               zzlextext = &(zztextLA[0][0]); zzrdfunc( f ); zzPrimeLookAhead;
+#define zzenterANTLR(f)                                                        \
+               zzlextext = &(zztextLA[0][0]); zzrdstream( f ); zzPrimeLookAhead;
+#ifdef ZZINF_LOOK
+#define zzleaveANTLR(f)                        free(zzinf_text_buffer); free(zzinf_text); free(zzinf_tokens); free(zzinf_line);
+#define zzleaveANTLRf(f)               free(zzinf_text_buffer); free(zzinf_text); free(zzinf_tokens); free(zzinf_line);
+#define zzleaveANTLRs(f)               free(zzinf_text_buffer); free(zzinf_text); free(zzinf_tokens); free(zzinf_line);
+#else
+#define zzleaveANTLR(f)
+#define zzleaveANTLRf(f)
+#define zzleaveANTLRs(f)
+#endif
+
+#else
+
+#define zzenterANTLRs(s)                            \
+        {static char zztoktext[ZZLEXBUFSIZE];   \
+        zzlextext = zztoktext; zzrdstr( s ); zzPrimeLookAhead;}
+#define zzenterANTLRf(f)                                                       \
+               {static char zztoktext[ZZLEXBUFSIZE];   \
+               zzlextext = zztoktext; zzrdfunc( f ); zzPrimeLookAhead;}
+#define zzenterANTLR(f)                                                        \
+               {static char zztoktext[ZZLEXBUFSIZE];   \
+               zzlextext = zztoktext; zzrdstream( f ); zzPrimeLookAhead;}
+#ifdef ZZINF_LOOK
+#define zzleaveANTLR(f)                        free(zzinf_text_buffer); free(zzinf_text); free(zzinf_tokens); free(zzinf_line);
+#define zzleaveANTLRf(f)               free(zzinf_text_buffer); free(zzinf_text); free(zzinf_tokens); free(zzinf_line);
+#define zzleaveANTLRs(f)               free(zzinf_text_buffer); free(zzinf_text); free(zzinf_tokens); free(zzinf_line);
+#else
+#define zzleaveANTLR(f)
+#define zzleaveANTLRf(f)
+#define zzleaveANTLRs(f)
+#endif
+
+#endif
+
+#define ANTLR(st, f)   zzbufsize = ZZLEXBUFSIZE;       \
+                                               zzenterANTLR(f);                        \
+                                               st; ++zzasp;                            \
+                                               zzleaveANTLR(f);
+                                               
+#define ANTLRm(st, f, _m)      zzbufsize = ZZLEXBUFSIZE;       \
+                                               zzmode(_m);                             \
+                                               zzenterANTLR(f);                        \
+                                               st; ++zzasp;                            \
+                                               zzleaveANTLR(f);
+                                               
+#define ANTLRf(st, f)  zzbufsize = ZZLEXBUFSIZE;       \
+                                               zzenterANTLRf(f);                       \
+                                               st; ++zzasp;                            \
+                                               zzleaveANTLRf(f);
+
+#define ANTLRs(st, s)   zzbufsize = ZZLEXBUFSIZE;      \
+                        zzenterANTLRs(s);           \
+                        st; ++zzasp;                           \
+                        zzleaveANTLRs(s);
+
+#ifdef LL_K
+#define zztext         (&(zztextLA[zzlap][0]))
+#else
+#define zztext         zzlextext
+#endif
+
+
+                                       /* A r g u m e n t  A c c e s s */
+
+#define zzaCur                 (zzaStack[zzasp])
+#define zzaRet                 (*zzaRetPtr)
+#define zzaArg(v,n)            zzaStack[v-n]
+#define zzMakeAttr             { zzNON_GUESS_MODE {zzOvfChk; --zzasp; zzcr_attr(&(zzaStack[zzasp]),LA(1),LATEXT(1));}}
+#ifdef zzdef0
+#define zzMake0                        { zzOvfChk; --zzasp; zzdef0(&(zzaStack[zzasp]));}
+#else
+#define zzMake0                        { zzOvfChk; --zzasp;}
+#endif
+#define zzaPush(_v)            { zzOvfChk; zzaStack[--zzasp] = _v;}
+#ifndef zzd_attr
+#define zzREL(t)               zzasp=(t);              /* Restore state of stack */
+#else
+#define zzREL(t)               for (; zzasp<(t); zzasp++)                              \
+                                               { zzd_attr(&(zzaStack[zzasp])); }
+#endif
+
+#define zzsetmatch(_es)                                                \
+       if ( !_zzsetmatch(_es, &zzBadText, &zzMissText, &zzMissTok, &zzBadTok, &zzMissSet) ) goto fail;
+#define zzsetmatch_wsig(_es, handler)          \
+       if ( !_zzsetmatch_wsig(_es) ) {_signal=MismatchedToken; goto handler;}
+
+#ifdef __USE_PROTOS
+extern int _zzsetmatch(SetWordType *, char **, char **, int *, int *, SetWordType **);
+extern int _zzsetmatch_wsig(SetWordType *);
+#else
+extern int _zzsetmatch();
+extern int _zzsetmatch_wsig();
+#endif
+
+#define zzmatch(_t)                                                    \
+       if ( !_zzmatch(_t, &zzBadText, &zzMissText, &zzMissTok, &zzBadTok, &zzMissSet) ) goto fail;
+#define zzmatch_wsig(_t,handler)                       \
+       if ( !_zzmatch_wsig(_t) ) {_signal=MismatchedToken; goto handler;}
+
+#ifdef __USE_PROTOS
+extern int _zzmatch(int, char **, char **, int *, int *, SetWordType **);
+extern int _zzmatch_wsig(int);
+#else
+extern int _zzmatch();
+extern int _zzmatch_wsig();
+#endif
+
+#define zzmatch_wdfltsig(_t,_f)                        \
+       if ( !_zzmatch_wdfltsig(_t,_f) ) _signal=MismatchedToken;
+#define zzsetmatch_wdfltsig(tw,tt,wf)          \
+       if ( !_zzsetmatch_wdfltsig(tw,tt,wf) ) _signal=MismatchedToken;
+
+#ifdef __USE_PROTOS
+extern int _zzmatch_wdfltsig(int, SetWordType *);
+extern int _zzsetmatch_wdfltsig(SetWordType *tokensWanted,
+                                                               int tokenTypeOfSet,
+                                                               SetWordType *whatFollows);
+#else
+extern int _zzmatch_wdfltsig();
+extern int _zzsetmatch_wdfltsig();
+#endif
+
+#ifdef GENAST
+#define zzRULE         Attrib *zzaRetPtr = &(zzaStack[zzasp-1]);       \
+                                       SetWordType *zzMissSet=NULL; int zzMissTok=0;           \
+                                       int zzBadTok=0; char *zzBadText="";             \
+                                       int zzErrk=1;                                                           \
+                                       char *zzMissText=""; zzASTVars
+#else
+#define zzRULE         Attrib *zzaRetPtr = &(zzaStack[zzasp-1]);       \
+                                       int zzBadTok=0; char *zzBadText="";             \
+                                       int zzErrk=1;                                                           \
+                                       SetWordType *zzMissSet=NULL; int zzMissTok=0; char *zzMissText=""
+#endif
+
+#ifdef GENAST
+#define zzBLOCK(i)     int i = zzasp - 1; int zztsp = zzast_sp
+#define zzEXIT(i)      zzREL(i); zzastREL; zzNON_GUESS_MODE { zzastPush(*_root); }
+#define zzLOOP(i)      zzREL(i); zzastREL
+#else
+#define zzBLOCK(i)     int i = zzasp - 1
+#define zzEXIT(i)      zzREL(i)
+#define zzLOOP(i)      zzREL(i)
+#endif
+
+#ifdef LL_K
+
+#ifdef DEMAND_LOOK
+#define LOOK(_k)       {int i,stop=_k-(LL_K-zzdirty); for (i=1; i<=stop; i++)  \
+                                       zzCONSUME;}
+#define zzCONSUME      {zzgettok(); zzdirty--;                                                 \
+                                       zzlap = (zzlap+1)&(LL_K-1);                                             \
+                                       zzlextext = &(zztextLA[zzlap][0]);}
+#else
+#ifdef ZZINF_LOOK
+#define zzCONSUME      {inf_zzgettok;                                                                  \
+                                       zzlap = (zzlap+1)&(LL_K-1);                                             \
+                                       zzlextext = &(zztextLA[zzlap][0]);                              \
+                                       }
+#else
+#define zzCONSUME      {zzgettok();                                                                    \
+                                       zzlap = (zzlap+1)&(LL_K-1);                                             \
+                                       zzlextext = &(zztextLA[zzlap][0]);}
+#endif /* ZZINF_LOOK */
+#endif /* DEMAND_LOOK */
+
+#else /* LL_K */
+
+#ifdef DEMAND_LOOK
+#define LOOK(_k)       if ( zzdirty) zzCONSUME;
+#ifdef ZZINF_LOOK
+#define zzCONSUME      inf_zzgettok; zzdirty=0;
+#else
+#define zzCONSUME      zzgettok(); zzdirty=0;
+#endif /* ZZINF_LOOK */
+
+#else  /* DEMAND_LOOK */
+
+#ifdef ZZINF_LOOK
+#define zzCONSUME      inf_zzgettok
+#else
+#define zzCONSUME      zzgettok();
+#endif
+
+#endif /* DEMAND_LOOK */
+
+#endif /* LL_K */
+
+#ifdef LL_K
+#define NLA                    zztokenLA[zzlap&(LL_K-1)]       /* --> next LA */
+#define NLATEXT                zztextLA[zzlap&(LL_K-1)]        /* --> next text of LA */
+#ifdef DEMAND_LOOK
+#define LA(i)       zztokenLA[(zzlabase+(i)-1)&(LL_K-1)]
+#define LATEXT(i)   (&(zztextLA[(zzlabase+(i)-1)&(LL_K-1)][0]))
+#else
+#define LA(i)       zztokenLA[(zzlap+(i)-1)&(LL_K-1)]
+#define LATEXT(i)   (&(zztextLA[(zzlap+(i)-1)&(LL_K-1)][0]))
+#endif
+#else
+#define NLA                    zztoken
+#define NLATEXT                zztext
+#define LA(i)       zztoken
+#define LATEXT(i)   zztext
+#endif
+
+
+           /* S t a n d a r d  S i g n a l s */
+
+#define NoSignal                       0
+#define MismatchedToken                1
+#define NoViableAlt                    2
+#define NoSemViableAlt         3
+
+
+           /* F u n c t i o n  T r a c i n g */
+
+#ifndef zzTRACEIN
+#define zzTRACEIN(r)   fprintf(stderr, "enter rule \"%s\"\n", r);
+#endif
+#ifndef zzTRACEOUT
+#define zzTRACEOUT(r)  fprintf(stderr, "exit rule \"%s\"\n", r);
+#endif
+
+#ifdef ZZWCHAR_T
+#define zzchar_t wchar_t
+#else
+#define zzchar_t char
+#endif
+
+                               /* E x t e r n  D e f s */
+
+#ifdef __USE_PROTOS
+extern Attrib zzempty_attr();
+extern Attrib zzconstr_attr(int, char *);
+extern void zzsyn(char *, int, char *, SetWordType *, int, int, char *);
+extern int zzset_el(unsigned, SetWordType *);
+extern int zzset_deg(SetWordType *);
+extern void zzedecode(SetWordType *);
+extern void zzFAIL(int k, ...);
+extern void zzresynch(SetWordType *, SetWordType);
+extern void zzsave_antlr_state(zzantlr_state *);
+extern void zzrestore_antlr_state(zzantlr_state *);
+extern void zzfill_inf_look(void);
+#ifdef EXCEPTION_HANDLING
+extern void zzdflthandlers(int, int *);
+#endif
+#else
+extern Attrib zzempty_attr();
+extern Attrib zzconstr_attr();
+extern void zzsyn();
+extern int zzset_el();
+extern int zzset_deg();
+extern void zzedecode();
+extern void zzFAIL();
+extern void zzresynch();
+extern void zzsave_antlr_state();
+extern void zzrestore_antlr_state();
+extern void zzfill_inf_look();
+#ifdef EXCEPTION_HANDLING
+extern void zzdflthandlers();
+#endif
+#endif
+
+                               /* G l o b a l  V a r i a b l e s */
+
+/* Define a parser; user should do a "#parser myname" in their grammar file */
+/*extern struct pccts_parser zzparser;*/
+
+extern char *zztokens[];
+#ifdef LL_K
+extern int zztokenLA[];
+extern char zztextLA[][ZZLEXBUFSIZE];
+extern int zzlap;
+extern int zzlabase;
+#else
+extern int zztoken;
+#endif
+
+extern char zzStackOvfMsg[];
+extern int zzasp;
+extern Attrib zzaStack[];
+#ifdef ZZINF_LOOK
+extern int *zzinf_tokens;
+extern char **zzinf_text;
+extern char *zzinf_text_buffer;
+extern int *zzinf_line;
+extern int zzinf_labase;
+extern int zzinf_last;
+#endif
+#ifdef DEMAND_LOOK
+extern int zzdirty;
+#endif
+#ifdef ZZCAN_GUESS
+extern int zzguessing;
+extern zzjmp_buf zzguess_start;
+#endif
+
+/* Define global veriables that refer to values exported by the scanner.
+ * These declarations duplicate those in dlgdef.h, but are needed
+ * if ANTLR is not to generate a .dlg file (-gx); PS, this is a hack.
+ */
+extern zzchar_t *zzlextext;     /* text of most recently matched token */
+extern int      zzbufsize;      /* how long zzlextext is */
+
+#endif
diff --git a/h/ast.h b/h/ast.h
new file mode 100755 (executable)
index 0000000..2f5deda
--- /dev/null
+++ b/h/ast.h
@@ -0,0 +1,115 @@
+/* Abstract syntax tree
+ *
+ * Macros, definitions
+ *
+ * SOFTWARE RIGHTS
+ *
+ * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
+ * Set (PCCTS) -- PCCTS is in the public domain.  An individual or
+ * company may do whatever they wish with source code distributed with
+ * PCCTS or the code generated by PCCTS, including the incorporation of
+ * PCCTS, or its output, into commerical software.
+ * 
+ * We encourage users to develop software with PCCTS.  However, we do ask
+ * that credit is given to us for developing PCCTS.  By "credit",
+ * we mean that if you incorporate our source code into one of your
+ * programs (commercial product, research project, or otherwise) that you
+ * acknowledge this fact somewhere in the documentation, research report,
+ * etc...  If you like PCCTS and have developed a nice tool with the
+ * output, please mention that you developed it using PCCTS.  In
+ * addition, we ask that this header remain intact in our source code.
+ * As long as these guidelines are kept, we expect to continue enhancing
+ * this system and expect to make other tools available as they are
+ * completed.
+ *
+ * ANTLR 1.33
+ * Terence Parr
+ * Parr Research Corporation
+ * with Purdue University and AHPCRC, University of Minnesota
+ * 1989-1995
+ */
+
+#ifndef ZZAST_H
+#define ZZAST_H
+
+#define zzastOvfChk                                                                                                            \
+                       if ( zzast_sp <= 0 )                                        \
+            {                                                           \
+                fprintf(stderr, zzStackOvfMsg, __FILE__, __LINE__);            \
+                exit(PCCTS_EXIT_FAILURE);                                               \
+            }
+
+#ifndef USER_DEFINED_AST
+#ifndef AST_FIELDS
+#define AST_FIELDS
+#endif
+
+typedef struct _ast {
+            struct _ast *right, *down;
+#ifdef zzAST_DOUBLE
+            struct _ast *left, *up;
+#endif
+            AST_FIELDS
+} AST;
+
+#else
+
+#ifdef zzAST_DOUBLE
+#define AST_REQUIRED_FIELDS   struct _ast *right, *down, *left, *up;
+#else
+#define AST_REQUIRED_FIELDS   struct _ast *right, *down;
+#endif
+
+#endif
+
+
+/* N o d e  a c c e s s  m a c r o s */
+#define zzchild(t)             (((t)==NULL)?NULL:(t->down))
+#define zzsibling(t)   (((t)==NULL)?NULL:(t->right))
+
+
+/* define global variables needed by #i stack */
+#define zzASTgvars                                                                                             \
+       AST *zzastStack[ZZAST_STACKSIZE];                                                       \
+       int zzast_sp = ZZAST_STACKSIZE;
+
+#define zzASTVars      AST *_ast = NULL, *_sibling = NULL, *_tail = NULL
+#define zzSTR          ( (_tail==NULL)?(&_sibling):(&(_tail->right)) )
+#define zzastCur       (zzastStack[zzast_sp])
+#define zzastArg(i)    (zzastStack[zztsp-i])
+#define zzastPush(p) zzastOvfChk; zzastStack[--zzast_sp] = p;
+#define zzastDPush     --zzast_sp
+#define zzastMARK      zztsp=zzast_sp;         /* Save state of stack */
+#define zzastREL       zzast_sp=zztsp;         /* Return state of stack */
+#define zzrm_ast       {zzfree_ast(*_root); _tail = _sibling = (*_root)=NULL;}
+
+extern int zzast_sp;
+extern AST *zzastStack[];
+
+#ifdef __STDC__
+void zzlink(AST **, AST **, AST **);
+void zzsubchild(AST **, AST **, AST **);
+void zzsubroot(AST **, AST **, AST **);
+void zzpre_ast(AST *, void (*)(), void (*)(), void (*)());
+void zzfree_ast(AST *);
+AST *zztmake(AST *, ...);
+AST *zzdup_ast(AST *);
+void zztfree(AST *);
+void zzdouble_link(AST *, AST *, AST *);
+AST *zzastnew(void);
+
+#else
+
+void zzlink();
+AST *zzastnew();
+void zzsubchild();
+void zzsubroot();
+void zzpre_ast();
+void zzfree_ast();
+AST *zztmake();
+AST *zzdup_ast();
+void zztfree();
+void zzdouble_link();
+#endif
+
+#endif
diff --git a/h/charptr.h b/h/charptr.h
new file mode 100755 (executable)
index 0000000..06dcaa0
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ *
+ * SOFTWARE RIGHTS
+ *
+ * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
+ * Set (PCCTS) -- PCCTS is in the public domain.  An individual or
+ * company may do whatever they wish with source code distributed with
+ * PCCTS or the code generated by PCCTS, including the incorporation of
+ * PCCTS, or its output, into commerical software.
+ * 
+ * We encourage users to develop software with PCCTS.  However, we do ask
+ * that credit is given to us for developing PCCTS.  By "credit",
+ * we mean that if you incorporate our source code into one of your
+ * programs (commercial product, research project, or otherwise) that you
+ * acknowledge this fact somewhere in the documentation, research report,
+ * etc...  If you like PCCTS and have developed a nice tool with the
+ * output, please mention that you developed it using PCCTS.  In
+ * addition, we ask that this header remain intact in our source code.
+ * As long as these guidelines are kept, we expect to continue enhancing
+ * this system and expect to make other tools available as they are
+ * completed.
+ *
+ * ANTLR 1.33
+ * Terence Parr
+ * Parr Research Corporation
+ * with Purdue University and AHPCRC, University of Minnesota
+ * 1989-1995
+ */
+
+/*
+ * WARNING!!!!: charptr.h does NOT make copies and the
+ * memory is freed after the attribute scope exits.
+ */
+
+#ifndef ZZCHARPTR_H
+#define ZZCHARPTR_H
+
+typedef char *Attrib;
+#define zzdef0(a)              {*(a)=NULL;}
+#define zzd_attr(a)            {if ( *(a)!=NULL ) free(*a);}
+
+#ifdef __STDC__
+extern zzcr_attr(Attrib *,int,char *);
+#endif
+
+#endif
diff --git a/h/dlgauto.h b/h/dlgauto.h
new file mode 100755 (executable)
index 0000000..7cc4609
--- /dev/null
@@ -0,0 +1,474 @@
+/* dlgauto.h automaton
+ *
+ * SOFTWARE RIGHTS
+ *
+ * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
+ * Set (PCCTS) -- PCCTS is in the public domain.  An individual or
+ * company may do whatever they wish with source code distributed with
+ * PCCTS or the code generated by PCCTS, including the incorporation of
+ * PCCTS, or its output, into commerical software.
+ * 
+ * We encourage users to develop software with PCCTS.  However, we do ask
+ * that credit is given to us for developing PCCTS.  By "credit",
+ * we mean that if you incorporate our source code into one of your
+ * programs (commercial product, research project, or otherwise) that you
+ * acknowledge this fact somewhere in the documentation, research report,
+ * etc...  If you like PCCTS and have developed a nice tool with the
+ * output, please mention that you developed it using PCCTS.  In
+ * addition, we ask that this header remain intact in our source code.
+ * As long as these guidelines are kept, we expect to continue enhancing
+ * this system and expect to make other tools available as they are
+ * completed.
+ *
+ * ANTLR 1.33
+ * Will Cohen and Terence Parr
+ * Parr Research Corporation
+ * with Purdue University and AHPCRC, University of Minnesota
+ * 1989-1995
+ */
+
+#ifndef ZZDEFAUTO_H
+#define ZZDEFAUTO_H
+
+zzchar_t       *zzlextext;     /* text of most recently matched token */
+zzchar_t       *zzbegexpr;     /* beginning of last reg expr recogn. */
+zzchar_t       *zzendexpr;     /* beginning of last reg expr recogn. */
+int    zzbufsize;      /* number of characters in zzlextext */
+int    zzbegcol = 0;   /* column that first character of token is in*/
+int    zzendcol = 0;   /* column that last character of token is in */
+int    zzline = 1;     /* line current token is on */
+int    zzreal_line=1;  /* line of 1st portion of token that is not skipped */
+int    zzchar;         /* character to determine next state */
+int    zzbufovf;       /* indicates that buffer too small for text */
+int    zzcharfull = 0;
+static zzchar_t        *zznextpos;/* points to next available position in zzlextext*/
+static int     zzclass;
+
+#ifdef __USE_PROTOS
+void   zzerrstd(const char *);
+void   (*zzerr)(const char *)=zzerrstd;/* pointer to error reporting function */
+extern int     zzerr_in(void);
+#else
+void   zzerrstd();
+void   (*zzerr)()=zzerrstd;    /* pointer to error reporting function */
+extern int     zzerr_in();
+#endif
+
+static FILE    *zzstream_in=0;
+static int     (*zzfunc_in)() = zzerr_in;
+static zzchar_t        *zzstr_in=0;
+
+#ifdef USER_ZZMODE_STACK
+int              zzauto = 0;
+#else
+static int     zzauto = 0;
+#endif
+static int     zzadd_erase;
+static char    zzebuf[70];
+
+#ifdef ZZCOL
+#define ZZINC (++zzendcol)
+#else
+#define ZZINC
+#endif
+
+
+#define ZZGETC_STREAM {zzchar = getc(zzstream_in); zzclass = ZZSHIFT(zzchar);}
+#define ZZGETC_FUNC {zzchar = (*zzfunc_in)(); zzclass = ZZSHIFT(zzchar);}
+#define ZZGETC_STR {                   \
+       if (*zzstr_in){                         \
+               zzchar = *zzstr_in;             \
+               ++zzstr_in;                             \
+       }else{                                          \
+               zzchar = EOF;                   \
+       }                                                       \
+       zzclass = ZZSHIFT(zzchar);      \
+}
+
+#define ZZNEWSTATE     (newstate = dfa[state][zzclass])
+
+#ifndef ZZCOPY
+#define ZZCOPY \
+       /* Truncate matching buffer to size (not an error) */   \
+       if (zznextpos < lastpos){                               \
+               *(zznextpos++) = zzchar;                        \
+       }else{                                                  \
+               zzbufovf = 1;                                   \
+       }
+#endif
+
+void
+#ifdef __USE_PROTOS
+zzrdstream( FILE *f )
+#else
+zzrdstream( f )
+FILE *f;
+#endif
+{
+       /* make sure that it is really set to something, otherwise just 
+          leave it be.
+       */
+       if (f){
+               /* make sure that there is always someplace to get input
+                  before closing zzstream_in
+               */
+#if 0
+               if (zzstream_in && zzstream_in!=stdin) fclose( zzstream_in );
+#endif
+               zzline = 1;
+               zzstream_in = f;
+               zzfunc_in = NULL;
+               zzstr_in = 0;
+               zzcharfull = 0;
+       }
+}
+
+void
+#ifdef __USE_PROTOS
+zzrdfunc( int (*f)() )
+#else
+zzrdfunc( f )
+int (*f)();
+#endif
+{
+       /* make sure that it is really set to something, otherwise just 
+          leave it be.
+       */
+       if (f){
+               /* make sure that there is always someplace to get input
+                  before closing zzstream_in
+               */
+#if 0
+               if (zzstream_in && zzstream_in!=stdin) fclose( zzstream_in );
+#endif
+               zzline = 1;
+               zzstream_in = NULL;
+               zzfunc_in = f;
+               zzstr_in = 0;
+               zzcharfull = 0;
+       }
+}
+
+
+void
+#ifdef __USE_PROTOS
+zzrdstr( zzchar_t *s )
+#else
+zzrdstr( s )
+zzchar_t *s;
+#endif
+{
+       /* make sure that it is really set to something, otherwise just 
+          leave it be.
+       */
+       if (s){
+               /* make sure that there is always someplace to get input
+                  before closing zzstream_in
+               */
+#if 0
+               if (zzstream_in && zzstream_in!=stdin) fclose( zzstream_in );
+#endif
+               zzline = 1;
+               zzstream_in = NULL;
+               zzfunc_in = 0;
+               zzstr_in = s;
+               zzcharfull = 0;
+       }
+}
+
+
+void
+zzclose_stream()
+{
+#if 0
+       fclose( zzstream_in );
+       zzstream_in = NULL;
+       zzfunc_in = NULL;
+#endif
+}
+
+/* saves dlg state, but not what feeds dlg (such as file position) */
+void
+#ifdef __USE_PROTOS
+zzsave_dlg_state(struct zzdlg_state *state)
+#else
+zzsave_dlg_state(state)
+struct zzdlg_state *state;
+#endif
+{
+       state->stream = zzstream_in;
+       state->func_ptr = zzfunc_in;
+       state->str = zzstr_in;
+       state->auto_num = zzauto;
+       state->add_erase = zzadd_erase;
+       state->lookc = zzchar;
+       state->char_full = zzcharfull;
+       state->begcol = zzbegcol;
+       state->endcol = zzendcol;
+       state->line = zzline;
+       state->lextext = zzlextext;
+       state->begexpr = zzbegexpr;
+       state->endexpr = zzendexpr;
+       state->bufsize = zzbufsize;
+       state->bufovf = zzbufovf;
+       state->nextpos = zznextpos;
+       state->class_num = zzclass;
+}
+
+void
+#ifdef __USE_PROTOS
+zzrestore_dlg_state(struct zzdlg_state *state)
+#else
+zzrestore_dlg_state(state)
+struct zzdlg_state *state;
+#endif
+{
+       zzstream_in = state->stream;
+       zzfunc_in = state->func_ptr;
+       zzstr_in = state->str;
+       zzauto = state->auto_num;
+       zzadd_erase = state->add_erase;
+       zzchar = state->lookc;
+       zzcharfull = state->char_full;
+       zzbegcol = state->begcol;
+       zzendcol = state->endcol;
+       zzline = state->line;
+       zzlextext = state->lextext;
+       zzbegexpr = state->begexpr;
+       zzendexpr = state->endexpr;
+       zzbufsize = state->bufsize;
+       zzbufovf = state->bufovf;
+       zznextpos = state->nextpos;
+       zzclass = state->class_num;
+}
+
+void
+#ifdef __USE_PROTOS
+zzmode( int m )
+#else
+zzmode( m )
+int m;
+#endif
+{
+       /* points to base of dfa table */
+       if (m<MAX_MODE){
+               zzauto = m;
+               /* have to redo class since using different compression */
+               zzclass = ZZSHIFT(zzchar);
+       }else{
+               sprintf(zzebuf,"Invalid automaton mode = %d ",m);
+               zzerr(zzebuf);
+       }
+}
+
+/* erase what is currently in the buffer, and get a new reg. expr */
+void
+zzskip()
+{
+       zzadd_erase = 1;
+}
+
+/* don't erase what is in the zzlextext buffer, add on to it */
+void
+zzmore()
+{
+       zzadd_erase = 2;
+}
+
+/* substitute c for the reg. expr last matched and is in the buffer */
+#ifdef __USE_PROTOS
+void
+zzreplchar(zzchar_t c)
+#else
+void
+zzreplchar(c)
+zzchar_t c;
+#endif
+{
+       /* can't allow overwriting null at end of string */
+       if (zzbegexpr < &zzlextext[zzbufsize-1]){
+               *zzbegexpr = c;
+               *(zzbegexpr+1) = '\0';
+       }
+       zzendexpr = zzbegexpr;
+       zznextpos = zzbegexpr + 1;
+}
+
+/* replace the string s for the reg. expr last matched and in the buffer */
+void
+#ifdef __USE_PROTOS
+zzreplstr(register zzchar_t *s)
+#else
+zzreplstr(s)
+register zzchar_t *s;
+#endif
+{
+       register zzchar_t *l= &zzlextext[zzbufsize -1];
+
+       zznextpos = zzbegexpr;
+       if (s){
+               while ((zznextpos <= l) && (*(zznextpos++) = *(s++))!=0){
+                       /* empty */
+               }
+               /* correct for NULL at end of string */
+               zznextpos--;
+       }
+       if ((zznextpos <= l) && (*(--s) == 0)){
+               zzbufovf = 0;
+       }else{
+               zzbufovf = 1;
+       }
+       *(zznextpos) = '\0';
+       zzendexpr = zznextpos - 1;
+}
+
+void
+zzgettok()
+{
+       register int state, newstate;
+       /* last space reserved for the null char */
+       register zzchar_t *lastpos;
+
+skip:
+       zzreal_line = zzline;
+       zzbufovf = 0;
+       lastpos = &zzlextext[zzbufsize-1];
+       zznextpos = zzlextext;
+       zzbegcol = zzendcol+1;
+more:
+       zzbegexpr = zznextpos;
+#ifdef ZZINTERACTIVE
+       /* interactive version of automaton */
+       /* if there is something in zzchar, process it */
+       state = newstate = dfa_base[zzauto];
+       if (zzcharfull){
+               ZZINC;
+               ZZCOPY;
+               ZZNEWSTATE;
+       }
+       if (zzstr_in)
+               while (zzalternatives[newstate]){
+                       state = newstate;
+                       ZZGETC_STR;
+                       ZZINC;
+                       ZZCOPY;
+                       ZZNEWSTATE;
+               }
+       else if (zzstream_in)
+               while (zzalternatives[newstate]){
+                       state = newstate;
+                       ZZGETC_STREAM;
+                       ZZINC;
+                       ZZCOPY;
+                       ZZNEWSTATE;
+               }
+       else if (zzfunc_in)
+               while (zzalternatives[newstate]){
+                       state = newstate;
+                       ZZGETC_FUNC;
+                       ZZINC;
+                       ZZCOPY;
+                       ZZNEWSTATE;
+               }
+       /* figure out if last character really part of token */
+       if ((state != dfa_base[zzauto]) && (newstate == DfaStates)){
+               zzcharfull = 1;
+               --zznextpos;
+       }else{
+               zzcharfull = 0;
+               state = newstate;
+       }
+       *(zznextpos) = '\0';
+       /* Able to transition out of start state to some non err state?*/
+       if ( state == dfa_base[zzauto] ){
+               /* make sure doesn't get stuck */
+               zzadvance();
+       }
+#else
+       /* non-interactive version of automaton */
+       if (!zzcharfull)
+               zzadvance();
+       else
+               ZZINC;
+       state = dfa_base[zzauto];
+       if (zzstr_in)
+               while (ZZNEWSTATE != DfaStates){
+                       state = newstate;
+                       ZZCOPY;
+                       ZZGETC_STR;
+                       ZZINC;
+               }
+       else if (zzstream_in)
+               while (ZZNEWSTATE != DfaStates){
+                       state = newstate;
+                       ZZCOPY;
+                       ZZGETC_STREAM;
+                       ZZINC;
+               }
+       else if (zzfunc_in)
+               while (ZZNEWSTATE != DfaStates){
+                       state = newstate;
+                       ZZCOPY;
+                       ZZGETC_FUNC;
+                       ZZINC;
+               }
+       zzcharfull = 1;
+       if ( state == dfa_base[zzauto] ){
+               if (zznextpos < lastpos){
+                       *(zznextpos++) = zzchar;
+               }else{
+                       zzbufovf = 1;
+               }
+               *zznextpos = '\0';
+               /* make sure doesn't get stuck */
+               zzadvance();
+       }else{
+               *zznextpos = '\0';
+       }
+#endif
+#ifdef ZZCOL
+       zzendcol -= zzcharfull;
+#endif
+       zzendexpr = zznextpos -1;
+       zzadd_erase = 0;
+       (*actions[accepts[state]])();
+       switch (zzadd_erase) {
+               case 1: goto skip;
+               case 2: goto more;
+       }
+}
+
+void
+zzadvance()
+{
+       if (zzstream_in) { ZZGETC_STREAM; zzcharfull = 1; ZZINC;}
+       if (zzfunc_in) { ZZGETC_FUNC; zzcharfull = 1; ZZINC;}
+       if (zzstr_in) { ZZGETC_STR; zzcharfull = 1; ZZINC;}
+       if (!(zzstream_in || zzfunc_in || zzstr_in)){
+               zzerr_in();
+       }
+}
+
+void
+#ifdef __USE_PROTOS
+zzerrstd(const char *s)
+#else
+zzerrstd(s)
+char *s;
+#endif
+{
+        fprintf(stderr,
+                "%s near line %d (text was '%s')\n",
+                ((s == NULL) ? "Lexical error" : s),
+                zzline,zzlextext);
+}
+
+int
+zzerr_in()
+{
+       fprintf(stderr,"No input stream, function, or string\n");
+       /* return eof to get out gracefully */
+       return EOF;
+}
+
+#endif
diff --git a/h/err.h b/h/err.h
new file mode 100755 (executable)
index 0000000..8e02d94
--- /dev/null
+++ b/h/err.h
@@ -0,0 +1,861 @@
+/*
+ * err.h
+ *
+ * Standard error handling mechanism
+ *
+ * SOFTWARE RIGHTS
+ *
+ * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
+ * Set (PCCTS) -- PCCTS is in the public domain.  An individual or
+ * company may do whatever they wish with source code distributed with
+ * PCCTS or the code generated by PCCTS, including the incorporation of
+ * PCCTS, or its output, into commerical software.
+ * 
+ * We encourage users to develop software with PCCTS.  However, we do ask
+ * that credit is given to us for developing PCCTS.  By "credit",
+ * we mean that if you incorporate our source code into one of your
+ * programs (commercial product, research project, or otherwise) that you
+ * acknowledge this fact somewhere in the documentation, research report,
+ * etc...  If you like PCCTS and have developed a nice tool with the
+ * output, please mention that you developed it using PCCTS.  In
+ * addition, we ask that this header remain intact in our source code.
+ * As long as these guidelines are kept, we expect to continue enhancing
+ * this system and expect to make other tools available as they are
+ * completed.
+ *
+ * Has grown to hold all kinds of stuff (err.h is increasingly misnamed)
+ *
+ * ANTLR 1.33
+ * Terence Parr
+ * Parr Research Corporation
+ * with Purdue University and AHPCRC, University of Minnesota
+ * 1989-1995
+ */
+
+#ifndef ERR_H
+#define ERR_H
+
+#include "config.h"
+
+#include <string.h>
+#ifdef __STDC__
+#include <stdarg.h>
+#else
+#include <varargs.h>
+#endif
+
+#ifdef DUM
+/* Define usable bits per unsigned int word (used for set stuff) */
+#ifdef PC
+#define BSETWORDSIZE 16
+#define BSETLOGWORDSIZE        4
+#else
+#define        BSETWORDSIZE 32
+#define BSETLOGWORDSIZE 5
+#endif
+#endif
+
+#define        BSETWORDSIZE 8
+#define BSETLOGWORDSIZE 3              /* SetWordType is 8bits */
+
+#define        BSETMODWORD(x) ((x) & (BSETWORDSIZE-1))         /* x % BSETWORDSIZE */
+#define        BSETDIVWORD(x) ((x) >> BSETLOGWORDSIZE)         /* x / BSETWORDSIZE */
+
+/* This is not put into the global pccts_parser structure because it is
+ * hidden and does not need to be saved during a "save state" operation
+ */
+/* maximum of 32 bits/unsigned int and must be 8 bits/byte */
+static SetWordType bitmask[] = {
+       0x00000001, 0x00000002, 0x00000004, 0x00000008,
+       0x00000010, 0x00000020, 0x00000040, 0x00000080
+};
+
+void
+#ifdef __USE_PROTOS
+zzresynch(SetWordType *wd,SetWordType mask)
+#else
+zzresynch(wd,mask)
+SetWordType *wd, mask;
+#endif
+{
+       static int consumed = 1;
+
+       /* if you enter here without having consumed a token from last resynch
+        * force a token consumption.
+        */
+       if ( !consumed ) {zzCONSUME; return;}
+
+       /* if current token is in resynch set, we've got what we wanted */
+       if ( wd[LA(1)]&mask || LA(1) == zzEOF_TOKEN ) {consumed=0; return;}
+       
+       /* scan until we find something in the resynch set */
+       while ( !(wd[LA(1)]&mask) && LA(1) != zzEOF_TOKEN ) {zzCONSUME;}
+       consumed=1;
+}
+
+void
+#ifdef __USE_PROTOS
+zzconsumeUntil(SetWordType *st)
+#else
+zzconsumeUntil(st)
+SetWordType *st;
+#endif
+{
+       while ( !zzset_el(LA(1), st) ) { zzCONSUME; }
+}
+
+void
+#ifdef __USE_PROTOS
+zzconsumeUntilToken(int t)
+#else
+zzconsumeUntilToken(t)
+int t;
+#endif
+{
+       while ( LA(1)!=t ) { zzCONSUME; }
+}
+
+/* input looks like:
+ *             zzFAIL(k, e1, e2, ...,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText)
+ * where the zzMiss stuff is set here to the token that did not match
+ * (and which set wasn't it a member of).
+ */
+void
+#ifdef __USE_PROTOS
+zzFAIL(int k, ...)
+#else
+zzFAIL(va_alist)
+va_dcl
+#endif
+{
+#ifdef LL_K
+       static char text[LL_K*ZZLEXBUFSIZE+1];
+       SetWordType *f[LL_K];
+#else
+       static char text[ZZLEXBUFSIZE+1];
+       SetWordType *f[1];
+#endif
+       SetWordType **miss_set;
+       char **miss_text;
+       int *bad_tok;
+       char **bad_text;
+       int *err_k;
+       int i;
+       va_list ap;
+#ifndef __USE_PROTOS
+       int k;
+#endif
+#ifdef __USE_PROTOS
+       va_start(ap, k);
+#else
+       va_start(ap);
+       k = va_arg(ap, int);    /* how many lookahead sets? */
+#endif
+       text[0] = '\0';
+       for (i=1; i<=k; i++)    /* collect all lookahead sets */
+       {
+               f[i-1] = va_arg(ap, SetWordType *);
+       }
+       for (i=1; i<=k; i++)    /* look for offending token */
+       {
+               if ( i>1 ) strcat(text, " ");
+               strcat(text, LATEXT(i));
+               if ( !zzset_el((unsigned)LA(i), f[i-1]) ) break;
+       }
+       miss_set = va_arg(ap, SetWordType **);
+       miss_text = va_arg(ap, char **);
+       bad_tok = va_arg(ap, int *);
+       bad_text = va_arg(ap, char **);
+       err_k = va_arg(ap, int *);
+       if ( i>k )
+       {
+               /* bad; lookahead is permutation that cannot be matched,
+                * but, the ith token of lookahead is valid at the ith position
+                * (The old LL sub 1 (k) versus LL(k) parsing technique)
+                */
+               *miss_set = NULL;
+               *miss_text = zzlextext;
+               *bad_tok = LA(1);
+               *bad_text = LATEXT(1);
+               *err_k = k;
+               return;
+       }
+/*     fprintf(stderr, "%s not in %dth set\n", zztokens[LA(i)], i);*/
+       *miss_set = f[i-1];
+       *miss_text = text;
+       *bad_tok = LA(i);
+       *bad_text = LATEXT(i);
+       if ( i==1 ) *err_k = 1;
+       else *err_k = k;
+}
+
+void
+#ifdef __USE_PROTOS
+zzsave_antlr_state(zzantlr_state *buf)
+#else
+zzsave_antlr_state(buf)
+zzantlr_state *buf;
+#endif
+{
+#ifdef LL_K
+       int i;
+#endif
+
+#ifdef ZZCAN_GUESS
+       buf->guess_start = zzguess_start;
+       buf->guessing = zzguessing;
+#endif
+       buf->asp = zzasp;
+#ifdef GENAST
+       buf->ast_sp = zzast_sp;
+#endif
+#ifdef ZZINF_LOOK
+       buf->inf_labase = zzinf_labase;
+       buf->inf_last = zzinf_last;
+#endif
+#ifdef DEMAND_LOOK
+       buf->dirty = zzdirty;
+#endif
+#ifdef LL_K
+       for (i=0; i<LL_K; i++) buf->tokenLA[i] = zztokenLA[i];
+       for (i=0; i<LL_K; i++) strcpy(buf->textLA[i], zztextLA[i]);
+       buf->lap = zzlap;
+       buf->labase = zzlabase;
+#else
+       buf->token = zztoken;
+       strcpy(buf->text, zzlextext);
+#endif
+}
+
+void
+#ifdef __USE_PROTOS
+zzrestore_antlr_state(zzantlr_state *buf)
+#else
+zzrestore_antlr_state(buf)
+zzantlr_state *buf;
+#endif
+{
+#ifdef LL_K
+       int i;
+#endif
+
+#ifdef ZZCAN_GUESS
+       zzguess_start = buf->guess_start;
+       zzguessing = buf->guessing;
+#endif
+       zzasp = buf->asp;
+#ifdef GENAST
+       zzast_sp = buf->ast_sp;
+#endif
+#ifdef ZZINF_LOOK
+       zzinf_labase = buf->inf_labase;
+       zzinf_last = buf->inf_last;
+#endif
+#ifdef DEMAND_LOOK
+       zzdirty = buf->dirty;
+#endif
+#ifdef LL_K
+       for (i=0; i<LL_K; i++) zztokenLA[i] = buf->tokenLA[i];
+       for (i=0; i<LL_K; i++) strcpy(zztextLA[i], buf->textLA[i]);
+       zzlap = buf->lap;
+       zzlabase = buf->labase;
+#else
+       zztoken = buf->token;
+       strcpy(zzlextext, buf->text);
+#endif
+}
+
+void
+#ifdef __USE_PROTOS
+zzedecode(SetWordType *a)
+#else
+zzedecode(a)
+SetWordType *a;
+#endif
+{
+       register SetWordType *p = a;
+       register SetWordType *endp = &(p[zzSET_SIZE]);
+       register unsigned e = 0;
+
+       if ( zzset_deg(a)>1 ) fprintf(stderr, " {");
+       do {
+               register SetWordType t = *p;
+               register SetWordType *b = &(bitmask[0]);
+               do {
+                       if ( t & *b ) fprintf(stderr, " %s", zztokens[e]);
+                       e++;
+               } while (++b < &(bitmask[sizeof(SetWordType)*8]));
+       } while (++p < endp);
+       if ( zzset_deg(a)>1 ) fprintf(stderr, " }");
+}
+
+#ifndef USER_ZZSYN
+/* standard error reporting function */
+void
+#ifdef __USE_PROTOS
+zzsyn(char *text, int tok, char *egroup, SetWordType *eset, int etok, int k, char *bad_text)
+#else
+zzsyn(text, tok, egroup, eset, etok, k, bad_text)
+char *text, *egroup, *bad_text;
+int tok;
+int etok;
+int k;
+SetWordType *eset;
+#endif
+{
+       
+       fprintf(stderr, "line %d: syntax error at \"%s\"", zzline, (tok==zzEOF_TOKEN)?"EOF":bad_text);
+       if ( !etok && !eset ) {fprintf(stderr, "\n"); return;}
+       if ( k==1 ) fprintf(stderr, " missing");
+       else
+       {
+               fprintf(stderr, "; \"%s\" not", bad_text);
+               if ( zzset_deg(eset)>1 ) fprintf(stderr, " in");
+       }
+       if ( zzset_deg(eset)>0 ) zzedecode(eset);
+       else fprintf(stderr, " %s", zztokens[etok]);
+       if ( strlen(egroup) > 0 ) fprintf(stderr, " in %s", egroup);
+       fprintf(stderr, "\n");
+}
+#endif
+
+/* is b an element of set p? */
+int
+#ifdef __USE_PROTOS
+zzset_el(unsigned b, SetWordType *p)
+#else
+zzset_el(b,p)
+unsigned b;
+SetWordType *p;
+#endif
+{
+       return( p[BSETDIVWORD(b)] & bitmask[BSETMODWORD(b)] );
+}
+
+int
+#ifdef __USE_PROTOS
+zzset_deg(SetWordType *a)
+#else
+zzset_deg(a)
+SetWordType *a;
+#endif
+{
+       /* Fast compute degree of a set... the number
+          of elements present in the set.  Assumes
+          that all word bits are used in the set
+       */
+       register SetWordType *p = a;
+       register SetWordType *endp = &(a[zzSET_SIZE]);
+       register int degree = 0;
+
+       if ( a == NULL ) return 0;
+       while ( p < endp )
+       {
+               register SetWordType t = *p;
+               register SetWordType *b = &(bitmask[0]);
+               do {
+                       if (t & *b) ++degree;
+               } while (++b < &(bitmask[sizeof(SetWordType)*8]));
+               p++;
+       }
+
+       return(degree);
+}
+
+#ifdef DEMAND_LOOK
+
+#ifdef LL_K
+int
+#ifdef __USE_PROTOS
+_zzmatch(int _t, char **zzBadText, char **zzMissText,
+               int *zzMissTok, int *zzBadTok,
+               SetWordType **zzMissSet)
+#else
+_zzmatch(_t, zzBadText, zzMissText, zzMissTok, zzBadTok, zzMissSet)
+int _t;
+char **zzBadText;
+char **zzMissText;
+int *zzMissTok, *zzBadTok;
+SetWordType **zzMissSet;
+#endif
+{
+       if ( zzdirty==LL_K ) {
+               zzCONSUME;
+       }
+       if ( LA(1)!=_t ) {
+               *zzBadText = *zzMissText=LATEXT(1);     
+               *zzMissTok= _t; *zzBadTok=LA(1); 
+               *zzMissSet=NULL;                                
+               return 0;
+       }
+       zzMakeAttr                                              
+       zzdirty++;                                              
+       zzlabase++;                                             
+       return 1;
+}
+
+int
+#ifdef __USE_PROTOS
+_zzmatch_wsig(int _t)
+#else
+_zzmatch_wsig(_t)
+int _t;
+#endif
+{
+       if ( zzdirty==LL_K ) {
+               zzCONSUME;
+       }
+       if ( LA(1)!=_t ) {
+               return 0;
+       }
+       zzMakeAttr                                              
+       zzdirty++;                                              
+       zzlabase++;                                             
+       return 1;
+}
+
+#else
+
+int
+#ifdef __USE_PROTOS
+_zzmatch(int _t, char **zzBadText, char **zzMissText,
+                int *zzMissTok, int *zzBadTok, SetWordType **zzMissSet)
+#else
+_zzmatch(_t, zzBadText, zzMissText, zzMissTok, zzBadTok, zzMissSet)
+int _t;
+char **zzBadText;
+char **zzMissText;
+int *zzMissTok, *zzBadTok;
+SetWordType **zzMissSet;
+#endif
+{                                                              
+       if ( zzdirty ) {zzCONSUME;}             
+       if ( LA(1)!=_t ) {
+               *zzBadText = *zzMissText=LATEXT(1);     
+               *zzMissTok= _t; *zzBadTok=LA(1); 
+               *zzMissSet=NULL;                                
+               return 0;
+       }                                                               
+       zzdirty = 1;                                    
+       zzMakeAttr                                              
+       return 1;
+}
+
+int
+#ifdef __USE_PROTOS
+_zzmatch_wsig(int _t)
+#else
+_zzmatch_wsig(_t)
+int _t;
+#endif
+{
+       if ( zzdirty ) {zzCONSUME;}             
+       if ( LA(1)!=_t ) {
+               return 0;
+       }
+       zzdirty = 1;                                    
+       zzMakeAttr                                              
+       return 1;
+}
+
+#endif /*LL_K*/
+
+#else
+
+int
+#ifdef __USE_PROTOS
+_zzmatch(int _t, char **zzBadText, char **zzMissText,
+               int *zzMissTok, int *zzBadTok,
+               SetWordType **zzMissSet)
+#else
+_zzmatch(_t, zzBadText, zzMissText, zzMissTok, zzBadTok, zzMissSet)
+int _t;
+char **zzBadText;
+char **zzMissText;
+int *zzMissTok, *zzBadTok;
+SetWordType **zzMissSet;
+#endif
+{
+       if ( LA(1)!=_t ) {                              
+               *zzBadText = *zzMissText=LATEXT(1);     
+               *zzMissTok= _t; *zzBadTok=LA(1); 
+               *zzMissSet=NULL;                                
+               return 0;
+       }
+       zzMakeAttr
+       return 1;
+}
+
+int
+#ifdef __USE_PROTOS
+_zzmatch_wsig(int _t)
+#else
+_zzmatch_wsig(_t)
+int _t;
+#endif
+{
+       if ( LA(1)!=_t ) return 0;
+       zzMakeAttr                                              
+       return 1;
+}
+
+#endif /*DEMAND_LOOK*/
+
+#ifdef ZZINF_LOOK
+void
+#ifdef __USE_PROTOS
+_inf_zzgettok(void)
+#else
+_inf_zzgettok()
+#endif
+{
+       if ( zzinf_labase >= zzinf_last )                                       
+               {NLA = zzEOF_TOKEN; strcpy(NLATEXT, "");}       
+       else {                                                                                  
+               NLA = zzinf_tokens[zzinf_labase];
+               zzline = zzinf_line[zzinf_labase];      /* wrong in 1.21 */
+               strcpy(NLATEXT, zzinf_text[zzinf_labase]);              
+               zzinf_labase++;                                                                 
+       }                                                                                               
+}
+#endif
+
+#ifdef ZZINF_LOOK
+/* allocate default size text,token and line arrays;
+ * then, read all of the input reallocing the arrays as needed.
+ * Once the number of total tokens is known, the LATEXT(i) array (zzinf_text)
+ * is allocated and it's pointers are set to the tokens in zzinf_text_buffer.
+ */
+void
+#ifdef __USE_PROTOS
+zzfill_inf_look(void)
+#else
+zzfill_inf_look()
+#endif
+{
+       int tok, line;
+       int zzinf_token_buffer_size = ZZINF_DEF_TOKEN_BUFFER_SIZE;
+       int zzinf_text_buffer_size = ZZINF_DEF_TEXT_BUFFER_SIZE;
+       int zzinf_text_buffer_index = 0;
+       int zzinf_lap = 0;
+
+       /* allocate text/token buffers */
+       zzinf_text_buffer = (char *) malloc(zzinf_text_buffer_size);
+       if ( zzinf_text_buffer == NULL )
+       {
+               fprintf(stderr, "cannot allocate lookahead text buffer (%d bytes)\n", 
+               zzinf_text_buffer_size);
+               exit(PCCTS_EXIT_FAILURE);                                                                           
+       }
+       zzinf_tokens = (int *) calloc(zzinf_token_buffer_size,sizeof(int)); 
+       if ( zzinf_tokens == NULL )
+       {
+               fprintf(stderr, "cannot allocate token buffer (%d tokens)\n", 
+                               zzinf_token_buffer_size);
+               exit(PCCTS_EXIT_FAILURE);                                                                           
+       }
+    zzinf_line = (int *) calloc(zzinf_token_buffer_size,sizeof(int));
+    if ( zzinf_line == NULL )
+    {
+        fprintf(stderr, "cannot allocate line buffer (%d ints)\n",
+                zzinf_token_buffer_size);
+        exit(PCCTS_EXIT_FAILURE);
+       }
+
+       /* get tokens, copying text to text buffer */
+       zzinf_text_buffer_index = 0;
+       do {
+               zzgettok();
+               line = zzreal_line;
+               while ( zzinf_lap>=zzinf_token_buffer_size )
+               {
+                       zzinf_token_buffer_size += ZZINF_BUFFER_TOKEN_CHUNK_SIZE; 
+                       zzinf_tokens = (int *) realloc(zzinf_tokens,
+                                                                                                zzinf_token_buffer_size*sizeof(int));
+                       if ( zzinf_tokens == NULL )
+                       {
+                               fprintf(stderr, "cannot allocate lookahead token buffer (%d tokens)\n", 
+                                               zzinf_token_buffer_size);
+                               exit(PCCTS_EXIT_FAILURE);
+                       }
+            zzinf_line = (int *) realloc(zzinf_line,
+                                         zzinf_token_buffer_size*sizeof(int));
+            if ( zzinf_line == NULL )
+            {
+                fprintf(stderr, "cannot allocate lookahead line buffer (%d ints)\n",
+                        zzinf_token_buffer_size);
+                exit(PCCTS_EXIT_FAILURE);
+                       }
+
+               }
+               while ( (zzinf_text_buffer_index+strlen(NLATEXT)+1) >= zzinf_text_buffer_size )
+               {
+                       zzinf_text_buffer_size += ZZINF_BUFFER_TEXT_CHUNK_SIZE; 
+                       zzinf_text_buffer = (char *) realloc(zzinf_text_buffer,
+                                                                                                zzinf_text_buffer_size);
+                       if ( zzinf_text_buffer == NULL )
+                       {
+                               fprintf(stderr, "cannot allocate lookahead text buffer (%d bytes)\n", 
+                                               zzinf_text_buffer_size);
+                               exit(PCCTS_EXIT_FAILURE);
+                       }
+               }
+               /* record token and text and line of input symbol */
+               tok = zzinf_tokens[zzinf_lap] = NLA;
+               strcpy(&zzinf_text_buffer[zzinf_text_buffer_index], NLATEXT);
+               zzinf_text_buffer_index += strlen(NLATEXT)+1;
+        zzinf_line[zzinf_lap] = line;
+               zzinf_lap++;
+       } while (tok!=zzEOF_TOKEN);
+       zzinf_labase = 0;
+       zzinf_last = zzinf_lap-1;
+
+       /* allocate ptrs to text of ith token */
+       zzinf_text = (char **) calloc(zzinf_last+1,sizeof(char *));
+       if ( zzinf_text == NULL )
+       {
+               fprintf(stderr, "cannot allocate lookahead text buffer (%d)\n", 
+                               zzinf_text_buffer_size); 
+               exit(PCCTS_EXIT_FAILURE);                                                                                   
+       }                                                                                                           
+       zzinf_text_buffer_index = 0;
+       zzinf_lap = 0;
+       /* set ptrs so that zzinf_text[i] is the text of the ith token found on input */
+       while (zzinf_lap<=zzinf_last)
+       {
+           zzinf_text[zzinf_lap++] = &zzinf_text_buffer[zzinf_text_buffer_index]; 
+               zzinf_text_buffer_index += strlen(&zzinf_text_buffer[zzinf_text_buffer_index])+1; 
+       }
+}
+#endif
+
+int
+#ifdef __USE_PROTOS
+_zzsetmatch(SetWordType *e, char **zzBadText, char **zzMissText,
+                       int *zzMissTok, int *zzBadTok,
+                       SetWordType **zzMissSet)
+#else
+_zzsetmatch(e, zzBadText, zzMissText, zzMissTok, zzBadTok, zzMissSet)
+SetWordType *e;
+char **zzBadText;
+char **zzMissText;
+int *zzMissTok, *zzBadTok;
+SetWordType **zzMissSet;
+#endif
+{
+#ifdef DEMAND_LOOK
+#ifdef LL_K
+       if ( zzdirty==LL_K ) {zzCONSUME;}
+#else
+       if ( zzdirty ) {zzCONSUME;}
+#endif
+#endif
+       if ( !zzset_el((unsigned)LA(1), e) ) {
+               *zzBadText = LATEXT(1); *zzMissText=NULL;
+               *zzMissTok= 0; *zzBadTok=LA(1);
+               *zzMissSet=e;
+               return 0;
+       }
+#ifdef DEMAND_LOOK
+#ifdef LL_K
+       zzdirty++;
+#else
+       zzdirty = 1;
+#endif
+#endif
+       zzMakeAttr
+       return 1;
+}
+
+int
+#ifdef __USE_PROTOS
+_zzmatch_wdfltsig(int tokenWanted, SetWordType *whatFollows)
+#else
+_zzmatch_wdfltsig(tokenWanted, whatFollows)
+int tokenWanted;
+SetWordType *whatFollows;
+#endif
+{
+#ifdef DEMAND_LOOK
+#ifdef LL_K
+       if ( zzdirty==LL_K ) {
+                       zzCONSUME;
+       }
+#else
+       if ( zzdirty ) {zzCONSUME;}
+#endif
+#endif
+
+       if ( LA(1)!=tokenWanted )
+       {
+               fprintf(stderr,
+                               "line %d: syntax error at \"%s\" missing %s\n",
+                               zzline,
+                               (LA(1)==zzEOF_TOKEN)?"<eof>":LATEXT(1),
+                               zztokens[tokenWanted]);
+               zzconsumeUntil( whatFollows );
+               return 0;
+       }
+       else {
+               zzMakeAttr                                              
+#ifdef DEMAND_LOOK
+#ifdef LL_K
+               zzdirty++;
+               zzlabase++;
+#else
+               zzdirty = 1;
+#endif
+#else
+/*             zzCONSUME;               consume if not demand lookahead */
+#endif
+               return 1;
+       }
+}
+
+int
+#ifdef __USE_PROTOS
+_zzsetmatch_wdfltsig(SetWordType *tokensWanted,
+                                        int tokenTypeOfSet,
+                                        SetWordType *whatFollows)
+#else
+_zzsetmatch_wdfltsig(tokensWanted, tokenTypeOfSet, whatFollows)
+SetWordType *tokensWanted;
+int tokenTypeOfSet;
+SetWordType *whatFollows;
+#endif
+{
+#ifdef DEMAND_LOOK
+#ifdef LL_K
+       if ( zzdirty==LL_K ) {zzCONSUME;}
+#else
+       if ( zzdirty ) {zzCONSUME;}
+#endif
+#endif
+       if ( !zzset_el((unsigned)LA(1), tokensWanted) )
+       {
+               fprintf(stderr,
+                               "line %d: syntax error at \"%s\" missing %s\n",
+                               zzline,
+                               (LA(1)==zzEOF_TOKEN)?"<eof>":LATEXT(1),
+                               zztokens[tokenTypeOfSet]);
+               zzconsumeUntil( whatFollows );
+               return 0;
+       }
+       else {
+               zzMakeAttr
+#ifdef DEMAND_LOOK
+#ifdef LL_K
+               zzdirty++;
+               zzlabase++;
+#else
+               zzdirty = 1;
+#endif
+#else
+/*             zzCONSUME;              consume if not demand lookahead */
+#endif
+               return 1;
+       }
+}
+
+int
+#ifdef __USE_PROTOS
+_zzsetmatch_wsig(SetWordType *e)
+#else
+_zzsetmatch_wsig(e)
+SetWordType *e;
+#endif
+{
+#ifdef DEMAND_LOOK
+#ifdef LL_K
+       if ( zzdirty==LL_K ) {zzCONSUME;}
+#else
+       if ( zzdirty ) {zzCONSUME;}
+#endif
+#endif
+       if ( !zzset_el((unsigned)LA(1), e) ) return 0;
+#ifdef DEMAND_LOOK
+#ifdef LL_K
+       zzdirty++;
+#else
+       zzdirty = 1;
+#endif
+#endif
+       zzMakeAttr
+       return 1;
+}
+
+#ifdef USER_ZZMODE_STACK
+static int  zzmstk[ZZMAXSTK] = { -1 };
+static int  zzmdep = 0;
+static char zzmbuf[70];
+
+void
+#ifdef __USE_PROTOS
+zzmpush( int m )
+#else
+zzmpush( m )
+int m;
+#endif
+{
+   if(zzmdep == ZZMAXSTK - 1) {
+     sprintf(zzmbuf, "Mode stack overflow ");
+     zzerr(zzmbuf);
+   } else {
+     zzmstk[zzmdep++] = zzauto;
+     zzmode(m);
+   }
+}
+
+void
+#ifdef __USE_PROTOS
+zzmpop( void )
+#else
+zzmpop( )
+#endif
+{
+   if(zzmdep == 0)
+   {  sprintf(zzmbuf, "Mode stack underflow ");
+      zzerr(zzmbuf);
+   }
+   else
+   {  zzmdep--;
+      zzmode(zzmstk[zzmdep]);
+   }
+}
+
+void
+#ifdef __USE_PROTOS
+zzsave_mode_stack( int modeStack[], int *modeLevel )
+#else
+zzsave_mode_stack( modeStack, modeLevel )
+int modeStack[];
+int *modeLevel;
+#endif
+{
+  int i;
+  memcpy(modeStack, zzmstk, sizeof(zzmstk));
+  *modeLevel = zzmdep;
+  zzmdep = 0;
+    
+  return;
+}
+
+void
+#ifdef __USE_PROTOS
+zzrestore_mode_stack( int modeStack[], int *modeLevel )
+#else
+zzrestore_mode_stack( modeStack, modeLevel )
+int modeStack[];
+int *modeLevel;
+#endif
+{
+  int i;
+
+  memcpy(zzmstk, modeStack, sizeof(zzmstk));
+  zzmdep = *modeLevel;
+    
+  return;
+}
+#endif /* USER_ZZMODE_STACK */
+
+#endif /* ERR_H */