genmk_old.c revision 4fd606d1f5abe38e1f42c38de1d2e895166bd0f4
/*
* genmk -- a program to make makefiles for PCCTS
*
* ANTLR 1.33MR10
* Terence John Parr 1989 - 1998
* Purdue University
* U of MN
*/
#include <stdio.h>
#include "pcctscfg.h" /* be sensitive to what ANTLR/DLG call the files */
#ifdef VAXC
#define DIE return 0;
#define DONE return 1;
#else
#define DIE return 1;
#define DONE return 0;
#endif
#ifndef require
#endif
#define MAX_FILES 50
#define MAX_CLASSES 50
char *RENAME_OBJ_FLAG="-o",
*RENAME_EXE_FLAG="-o";
char *dlg = "parser.dlg";
char *hdr = "stdpccts.h";
char *scan = "scan";
char ATOKENBUFFER_O[100];
char APARSER_O[100];
char ASTBASE_O[100];
char PCCTSAST_O[100];
char LIST_O[100];
char DLEXERBASE_O[100];
/* Option flags */
static int num_files = 0;
static int num_classes = 0;
static int user_lexer = 0;
static char *user_token_types = NULL;
static int gen_CPP = 0;
static char *outdir=".";
static char *dlg_class = "DLGLexer";
static int gen_trees = 0;
static int gen_hoist = 0;
static char *compilerCCC="CC";
static char *compilerCC="cc";
static char *pccts_path="/usr/local/pccts";
void help();
void mk();
void pfiles();
void pclasses();
void fatal();
void warn();
typedef struct _Opt {
char *option;
int arg;
#ifdef __cplusplus
void (*process)(...);
#else
void (*process)();
#endif
char *descr;
} Opt;
#ifdef __STDC__
static void ProcessArgs(int, char **, Opt *);
#else
static void ProcessArgs();
#endif
static void
pProj( s, t )
char *s;
char *t;
{
project = t;
}
static void
pUL( s )
char *s;
{
user_lexer = 1;
}
static void
pCPP( s )
char *s;
{
gen_CPP = 1;
}
static void
pUT( s, t )
char *s;
char *t;
{
user_token_types = t;
}
static void
pTrees( s )
char *s;
{
gen_trees = 1;
}
static void
pHoist( s )
char *s;
{
gen_hoist = 1;
}
static void
#ifdef __STDC__
pFile( char *s )
#else
pFile( s )
char *s;
#endif
{
if ( *s=='-' )
{
return;
}
}
static void
#ifdef __STDC__
pClass( char *s, char *t )
#else
pClass( s, t )
char *s;
char *t;
#endif
{
classes[num_classes++] = t;
}
static void
#ifdef __STDC__
pDLGClass( char *s, char *t )
#else
pDLGClass( s, t )
char *s;
char *t;
#endif
{
if ( !gen_CPP ) {
}
else dlg_class = t;
}
static void
#ifdef __STDC__
pOdir( char *s, char *t )
#else
pOdir( s, t )
char *s;
char *t;
#endif
{
outdir = t;
}
static void
#ifdef __STDC__
pHdr( char *s, char *t )
#else
pHdr( s, t )
char *s;
char *t;
#endif
{
hdr = t;
}
static void
#ifdef __STDC__
pCFiles( char *s, char *t )
#else
pCFiles( s, t )
char *s;
char *t;
#endif
{
}
static void
#ifdef __STDC__
pCompiler( char *s, char *t )
#else
pCompiler( s, t )
char *s;
char *t;
#endif
{
compilerCCC = t;
compilerCC = t;
}
static void
#ifdef __STDC__
ppccts_path( char *s, char *t )
#else
ppccts_path( s, t )
char *s;
char *t;
#endif
{
pccts_path = t;
}
};
extern char *DIR();
int argc;
char **argv;
{
if ( !gen_CPP && num_classes>0 ) {
warn("can't define classes w/o C++ mode; turning on C++ mode...\n");
gen_CPP=1;
}
if ( gen_CPP && num_classes==0 ) {
fatal("must define classes >0 grammar classes in C++ mode\n");
}
DONE;
}
void help()
{
{
buf[0]='\0';
p++;
}
}
char *project;
char **files;
int n;
int argc;
char **argv;
{
int i;
printf("#\n");
printf("# PCCTS makefile for: ");
printf("\n");
printf("#\n");
printf("# Created from:");
printf("\n");
printf("#\n");
printf("# PCCTS release 1.33MR21\n");
else printf("# C output\n");
else printf("# DLG scanner\n");
else printf("# ANTLR-defined token types\n");
printf("#\n");
printf(".SUFFIXES:\n.SUFFIXES: .o .cpp .c .h .g .i .dlg\n");
if ( user_token_types!=NULL ) {
printf("# Make sure #tokdefs directive in ANTLR grammar lists this file:\n");
}
printf("\n");
printf("#\n");
else printf("HDR_FILE =\n");
printf("CFLAGS = -I. -I$(ANTLR_H)");
printf(" $(COTHER)");
printf("\n");
printf("AFLAGS =");
if ( gen_hoist ) {
printf(" -mrhoist on") ;
} else {
printf(" -mrhoist off");
};
printf(" $(AOTHER)");
printf("\n");
printf("DFLAGS = -C2 -i");
printf(" $(DOTHER)");
printf("\n");
printf("GRM = ");
printf("\n");
printf("SRC = ");
if ( gen_CPP ) {
printf(" \\\n ");
printf(" ");
printf(" \\\n ");
if ( gen_trees ) {
printf(" \\\n ");
/* printf(" $(ANTLR_H)%s%s", DirectorySymbol, LIST_C); */
printf(" \\\n ");
}
}
if ( !user_lexer ) {
}
printf("\\\n $(MYFILES)\n");
printf("OBJ = ");
if ( gen_CPP ) {
printf(" \\\n ");
printf(" ");
printf(" \\\n ");
if ( !user_lexer ) {
}
if ( gen_trees ) {
printf(" \\\n ");
/* printf(" %s%s", DIR(), LIST_O); */
printf(" \\\n ");
}
}
if ( !user_lexer ) {
}
printf("\\\n $(MYFILES:.cpp=.o)\n");
printf("ANTLR_SPAWN = ");
if ( gen_CPP ) {
printf(" ");
printf(" \\\n ");
printf(" \\\n ");
printf("$(HDR_FILE) stdpccts.h");
}
}
if ( user_lexer ) {
}
else {
printf(" $(DLG_FILE)");
}
printf("\n");
if ( !user_lexer ) {
printf("\n");
}
if ( gen_CPP ) {
}
/* set up dependencies */
printf(" %s %s %s $(CFLAGS) $(OBJ)\n",
project);
printf("\n");
/* implicit rules */
if(gen_CPP)
printf("%%.o : %%.cpp\n\t$(CCC) -c $(CFLAGS) $<\n\n");
printf("%%.o : %%.c\n\t%s -c $(CFLAGS) $<\n\n",
/* how to compile parser files */
for (i=0; i<num_files; i++)
{
if ( user_lexer ) {
printf(" : $(TOKENS)");
}
else {
else printf(" : $(MOD_FILE) $(TOKENS)");
}
printf(" ");
printf("\n");
printf(" %s -c $(CFLAGS) %s ",
printf(" ");
printf("\n\n");
}
/* how to compile err.c */
if ( !gen_CPP ) {
printf("\n");
printf(" %s -c $(CFLAGS) %s $(ERR)%s $(ERR).c",
printf("\n\n");
}
/* how to compile Class.c */
for (i=0; i<num_classes; i++)
{
if ( user_lexer ) {
printf(" : $(TOKENS)");
}
else {
printf(" : $(TOKENS) $(SCAN).h");
}
printf(" ");
printf(" ");
printf("\n");
printf(" %s -c $(CFLAGS) %s ",
printf(" ");
printf("\n\n");
}
/* how to compile scan.c */
if ( !user_lexer ) {
printf("\n");
else printf(" $(CC) -c $(CFLAGS) %s %s$(SCAN)%s %s$(SCAN).c",
DIR(),
DIR());
printf("\n\n");
}
printf("$(ANTLR_SPAWN) : $(GRM)\n");
printf(" $(ANTLR) $(AFLAGS) $(GRM)\n");
if ( !user_lexer )
{
printf("\n");
printf("$(DLG_SPAWN) : $(DLG_FILE)\n");
else printf(" $(DLG) $(DFLAGS) $(DLG_FILE) $(SCAN).c\n");
}
if ( gen_CPP ) {
printf("\n");
printf(" %s -c $(CFLAGS) %s ",
printf("\n");
printf(" %s -c $(CFLAGS) %s ",
if ( !user_lexer ) {
printf("\n");
printf(" %s -c $(CFLAGS) %s ",
}
if ( gen_trees ) {
printf("\n");
printf(" %s -c $(CFLAGS) %s ",
printf("\n");
printf(" %s -c $(CFLAGS) %s ",
printf("\n");
/*
printf("%s%s : $(ANTLR_H)%s%s\n", DIR(), LIST_O, DirectorySymbol, LIST_C);
printf(" %s -c $(CFLAGS) %s ",
gen_CPP?"$(CCC)":"$(CC)",RENAME_OBJ_FLAG);
printf("%s%s $(ANTLR_H)%s%s\n", DIR(), LIST_O, DirectorySymbol, LIST_C);
*/
}
}
/* clean and scrub targets */
printf("\nclean:\n");
printf("\n");
printf("\nscrub:\n");
printf(" $(ANTLR_SPAWN)");
printf("\n");
}
char **files;
int n;
char *suffix;
{
int first=1;
while ( n>0 )
{
first=0;
while ( p > *files && *p != '.' ) --p;
if ( p == *files )
{
"genmk: filenames must be file.suffix format: %s\n",
*files);
exit(-1);
}
else
{
*p = '\0';
*p = '.';
}
files++;
--n;
}
}
char **classes;
int n;
char *suffix;
{
int first=1;
while ( n>0 )
{
first=0;
else {
}
classes++;
--n;
}
}
static void
#ifdef __STDC__
#else
int argc;
char **argv;
#endif
{
Opt *p;
while ( argc-- > 0 )
{
p = options;
{
{
if ( p->arg )
{
argv++;
argc--;
}
else
break;
}
p++;
}
argv++;
}
}
char *err_;
{
exit(1);
}
char *err_;
{
}
char *DIR()
{
return buf;
}