diff --git a/Grammar/Makefile b/Grammar/Makefile new file mode 100644 index 00000000000..a48bbdbe305 --- /dev/null +++ b/Grammar/Makefile @@ -0,0 +1,28 @@ +TOP= .. +PGENDIR= $(TOP)/Parser +PGEN= $(PGENDIR)/pgen +DESTH= $(TOP)/Py/graminit.h +DESTC= $(TOP)/Python/graminit.c + +all: install + +install: $(DESTH) $(DESTC) + +$(DESTH): graminit.h + cp graminit.h $(DESTH) + +$(DESTC): graminit.c + cp graminit.c $(DESTC) + +graminit.c graminit.h: $(PGEN) Grammar + $(PGEN) Grammar + +$(PGEN): + cd $(PGENDIR); make pgen + +clean: + -rm -f *.o core *~ [@,#]* *.old *.orig *.rej + -rm -f graminit.[ch] + +clobber: clean + -rm -f tags TAGS diff --git a/Parser/Makefile.in b/Parser/Makefile.in index 01d14f2b0c5..b5649aa0df7 100644 --- a/Parser/Makefile.in +++ b/Parser/Makefile.in @@ -9,23 +9,25 @@ VPATH= @srcdir@ CC= @CC@ RANLIB= @RANLIB@ +DEFS= @DEFS@ # === Other things that are customizable but not by configure === +TOP= .. +INCLDIR= $(TOP)/Py +OPT= -g +CFLAGS= $(OPT) -I$(INCLDIR) $(DEFS) + AR= ar MKDEP= mkdep SHELL= /bin/sh -INCLDIR= $(srcdir)/../Py -OPT= -g -CFLAGS= $(OPT) -I$(INCLDIR) - # === Fixed definitions === -PARSEROBJS= acceler.o fgetsintr.o grammar1.o \ - intrcheck.o listnode.o node.o parser.o \ +PARSEROBJS= acceler.o grammar1.o \ + intrcheck.o listnode.o myreadline.o node.o parser.o \ parsetok.o tokenizer.o bitset.o \ firstsets.o grammar.o metagrammar.o pgen.o \ printgrammar.o @@ -33,7 +35,7 @@ PARSEROBJS= acceler.o fgetsintr.o grammar1.o \ PGENOBJS= pgenmain.o PARSERSRCS= acceler.c fgetsintr.c grammar1.c \ - intrcheck.c listnode.c node.c parser.c \ + intrcheck.c listnode.c myreadline.c node.c parser.c \ parsetok.c tokenizer.c bitset.c \ firstsets.c grammar.c metagrammar.c pgen.c \ printgrammar.c @@ -51,19 +53,19 @@ all: $(LIB) $(PGEN) $(LIB): $(PARSEROBJS) $(AR) cr $(LIB) $(PARSEROBJS) + $(RANLIB) $(LIB) $(PGEN): $(PGENOBJS) $(LIB) $(CC) $(PGENOBJS) $(LIB) -o $(PGEN) clean: - -rm -f $(PARSEROBJS) $(PGENOBJS) - -rm -f core *~ [@,#]* *.old *.orig *.rej + -rm -f *.o core *~ [@,#]* *.old *.orig *.rej clobber: clean - -rm -f $(PGEN) $(LIB) tags TAGS + -rm -f $(PGEN) *.a tags TAGS -Makefile: Makefile.in ../config.status - (cd ..; $(SHELL) config.status) +Makefile: Makefile.in $(TOP)/config.status + CONFIG_FILES=Makefile $(SHELL) $(TOP)/config.status depend: $(PARSERSRCS) $(PGENSRCS) $(MKDEP) $(CFLAGS) $(PARSERSRCS) $(PGENSRCS) diff --git a/Parser/myreadline.c b/Parser/myreadline.c new file mode 100644 index 00000000000..870333ca9ad --- /dev/null +++ b/Parser/myreadline.c @@ -0,0 +1,119 @@ +/*********************************************************** +Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum, +Amsterdam, The Netherlands. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Stichting Mathematisch +Centrum or CWI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior permission. + +STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE +FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +******************************************************************/ + +/* Readline interface for tokenizer.c. + By default, we have a super simple my_readline function. + Optionally, we can use the GNU readline library (to be found in the + bash distribution). + my_readline() has a different return value from GNU readline(): + - NULL if an interrupt occurred or if an error occurred + - a malloc'ed empty string if EOF was read + - a malloc'ed string ending in \n normally +*/ + +#include +#include + +#include "mymalloc.h" + +#ifdef HAVE_READLINE + +extern char *readline(); + +#include +#include + +static jmp_buf jbuf; + +/* ARGSUSED */ +static RETSIGTYPE +onintr(sig) + int sig; +{ + longjmp(jbuf, 1); +} + +#endif /* HAVE_READLINE */ + +char * +my_readline(prompt) + char *prompt; +{ + int n; + char *p; +#ifdef HAVE_READLINE + RETSIGTYPE (*old_inthandler)(); + static int been_here; + if (!been_here) { + /* Force rebind of TAB to insert-tab */ + extern int rl_insert(); + rl_bind_key('\t', rl_insert); + been_here++; + } + old_inthandler = signal(SIGINT, onintr); + if (setjmp(jbuf)) { + signal(SIGINT, old_inthandler); + return NULL; + } + p = readline(prompt); + signal(SIGINT, old_inthandler); + if (p == NULL) { + p = malloc(1); + if (p != NULL) + *p = '\0'; + return p; + } + n = strlen(p); + if (n > 0) + add_history(p); + if ((p = realloc(p, n+2)) != NULL) { + p[n] = '\n'; + p[n+1] = '\0'; + } + return p; +#else /* !HAVE_READLINE */ + n = 100; + if ((p = malloc(n)) == NULL) + return NULL; + if (prompt) + fprintf(stderr, "%s", prompt); + if (fgets(p, n, stdin) == NULL) + *p = '\0'; + if (intrcheck()) { + free(p); + return NULL; + } + n = strlen(p); + while (n > 0 && p[n-1] != '\n') { + int incr = n+2; + p = realloc(p, n + incr); + if (p == NULL) + return NULL; + if (fgets(p+n, incr, stdin) == NULL) + break; + n += strlen(p+n); + } + return realloc(p, n+1); +#endif /* !HAVE_READLINE */ +}