📄 genmms.c
字号:
/* * genmms -- a program to make VMS makefiles for PCCTS * * ANTLR 1.33MR10 * Terence John Parr 1989 - 1998 * Purdue University * U of MN * * * VMS version from J.F. Pieronne */#include <stdio.h>#include <ssdef.h>#include "pcctscfg.h" /* be sensitive to what ANTLR/DLG call the files */#define DIE return SS$_ABORT;#define DONE return 1;#ifndef require#define require(expr, err) {if ( !(expr) ) fatal(err);}#endif#define MAX_FILES 50#define MAX_CLASSES 50char *RENAME_OBJ_FLAG="/obj=", *RENAME_EXE_FLAG="/exe=";char *dlg = "parser.dlg";char *err = "err.c";char *hdr = "stdpccts.h";char *tok = "tokens.h";char *mode = "mode.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 char *project="t", *files[MAX_FILES], *classes[MAX_CLASSES];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;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 *);#elsestatic void ProcessArgs();#endifstatic voidpProj( s, t )char *s;char *t;{ project = t;}static voidpUL( s )char *s;{ user_lexer = 1;}static voidpCPP( s )char *s;{ gen_CPP = 1;}static voidpUT( s, t )char *s;char *t;{ user_token_types = t;}static voidpTrees( s )char *s;{ gen_trees = 1;}static voidpHoist( s )char *s;{ gen_hoist = 1;}static void#ifdef __STDC__pFile( char *s )#elsepFile( s )char *s;#endif{ if ( *s=='-' ) { fprintf(stderr, "invalid option: '%s'; ignored...",s); return; } require(num_files<MAX_FILES, "exceeded max # of input files"); files[num_files++] = s;}static void#ifdef __STDC__pClass( char *s, char *t )#elsepClass( s, t )char *s;char *t;#endif{ require(num_classes<MAX_CLASSES, "exceeded max # of grammar classes"); classes[num_classes++] = t;}static void#ifdef __STDC__pDLGClass( char *s, char *t )#elsepDLGClass( s, t )char *s;char *t;#endif{ if ( !gen_CPP ) { fprintf(stderr, "-dlg-class makes no sense without C++ mode; ignored..."); } else dlg_class = t;}static void#ifdef __STDC__pOdir( char *s, char *t )#elsepOdir( s, t )char *s;char *t;#endif{ outdir = t;}static void#ifdef __STDC__pHdr( char *s, char *t )#elsepHdr( s, t )char *s;char *t;#endif{ hdr = t;}Opt options[] = { { "-cc", 0, pCPP, "Generate C++ output"}, { "-class", 1, pClass, "Name of a grammar class defined in grammar (if C++)"}, { "-dlg-class", 1,pDLGClass,"Name of DLG lexer class (default=DLGLexer) (if C++)"}, { "-header", 1,pHdr, "Name of ANTLR standard header info (default=no file)"}, { "-o", 1, pOdir, "Directory where output files should go (default=\".\")"}, { "-project", 1, pProj, "Name of executable to create (default=t)"}, { "-token-types", 1, pUT, "Token types are in this file (don't use tokens.h)"}, { "-trees", 0, pTrees, "Generate ASTs"}, { "-user-lexer", 0, pUL, "Do not create a DLG-based scanner"}, { "-mrhoist",0,pHoist, "Maintenance release style hoisting"}, { "*", 0, pFile, "" }, /* anything else is a file */ { NULL, 0, NULL, NULL }};extern char *DIR();main(argc, argv)int argc;char **argv;{ if ( argc == 1 ) { help(); DIE; } ProcessArgs(argc-1, &(argv[1]), options); strcpy(ATOKENBUFFER_O, ATOKENBUFFER_C); ATOKENBUFFER_O[strlen(ATOKENBUFFER_C)-strlen(CPP_FILE_SUFFIX)] = '\0'; strcat(ATOKENBUFFER_O, OBJ_FILE_SUFFIX); strcpy(APARSER_O, APARSER_C); APARSER_O[strlen(APARSER_O)-strlen(CPP_FILE_SUFFIX)] = '\0'; strcat(APARSER_O, OBJ_FILE_SUFFIX); strcpy(ASTBASE_O, ASTBASE_C); ASTBASE_O[strlen(ASTBASE_C)-strlen(CPP_FILE_SUFFIX)] = '\0'; strcat(ASTBASE_O, OBJ_FILE_SUFFIX); strcpy(PCCTSAST_O, PCCTSAST_C); PCCTSAST_O[strlen(PCCTSAST_C)-strlen(CPP_FILE_SUFFIX)] = '\0'; strcat(PCCTSAST_O, OBJ_FILE_SUFFIX); strcpy(LIST_O, LIST_C); LIST_O[strlen(LIST_C)-strlen(CPP_FILE_SUFFIX)] = '\0'; strcat(LIST_O, OBJ_FILE_SUFFIX); strcpy(DLEXERBASE_O, DLEXERBASE_C); DLEXERBASE_O[strlen(DLEXERBASE_C)-strlen(CPP_FILE_SUFFIX)] = '\0'; strcat(DLEXERBASE_O, OBJ_FILE_SUFFIX); if ( num_files == 0 ) fatal("no grammar files specified; exiting..."); 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"); } mk(project, files, num_files, argc, argv); DONE;}help(){ Opt *p = options; static char buf[1000+1]; fprintf(stderr, "genmk [options] f1.g ... fn.g\n"); while ( p->option!=NULL && *(p->option) != '*' ) { buf[0]='\0'; if ( p->arg ) sprintf(buf, "%s ___", p->option); else strcpy(buf, p->option); fprintf(stderr, "\t%-16s %s\n", buf, p->descr); p++; }}mk(project, files, n, argc, argv)char *project;char **files;int n;int argc;char **argv;{ int i; printf("!\n"); printf("! PCCTS makefile for: "); pfiles(files, n, NULL); printf("\n"); printf("!\n"); printf("! Created from:"); for (i=0; i<argc; i++) printf(" %s", argv[i]); printf("\n"); printf("!\n"); printf("! PCCTS release 1.33MR10\n"); printf("! Project: %s\n", project); if ( gen_CPP ) printf("! C++ output\n"); else printf("! C output\n"); if ( user_lexer ) printf("! User-defined scanner\n"); else printf("! DLG scanner\n"); if ( user_token_types!=NULL ) printf("! User-defined token types in '%s'\n", user_token_types); else printf("! ANTLR-defined token types\n"); printf("!\n"); if ( user_token_types!=NULL ) { printf("! Make sure #tokdefs directive in ANTLR grammar lists this file:\n"); printf("TOKENS = %s", user_token_types); } else printf("TOKENS = %stokens.h", DIR()); printf("\n"); printf("!\n"); printf("! The following filenames must be consistent with ANTLR/DLG flags\n"); printf("DLG_FILE = %s%s\n", DIR(), dlg); printf("ERR = %serr\n", DIR()); if ( strcmp(hdr,"stdpccts.h")!=0 ) printf("HDR_FILE = %s%s\n", DIR(), hdr); else printf("HDR_FILE =\n"); if ( !gen_CPP ) printf("MOD_FILE = %s%s\n", DIR(), mode); if ( !gen_CPP ) printf("SCAN = %s\n", scan); else printf("SCAN = %s%s\n", DIR(), dlg_class); printf("PCCTS = PCCTS_ROOT\n"); printf("ANTLR_H = $(PCCTS):[h]\n"); printf("BIN = $(PCCTS):[bin]\n"); printf("ANTLR = mcr $(BIN)antlr\n"); printf("DLG = mcr $(BIN)dlg\n"); printf("LNKFLAGS = /traceback\n"); if (gen_CPP) printf("CFLAGS =/ASSUME=NOHEADER_TYPE_DEFAULT/define=(__STDC__)/include=($(ANTLR_H)"); else printf("CFLAGS = /define=(__STDC__)/include=($(ANTLR_H)"); if ( strcmp(outdir, ".")!=0 ) printf(", %s", outdir); printf(") $(COTHER)"); printf("\n"); printf("AFLAGS ="); if ( strcmp(outdir,".")!=0 ) printf(" -o %s", outdir); if ( user_lexer ) printf(" -gx"); if ( gen_CPP ) printf(" -\"CC\""); if ( strcmp(hdr,"stdpccts.h")!=0 ) printf(" -gh %s", hdr); if ( gen_trees ) printf(" -gt"); if ( gen_hoist ) { printf(" -mrhoist on") ; } else { printf(" -mrhoist off"); }; printf(" $(AOTHER)"); printf("\n"); printf("DFLAGS = -\"C2\" -i"); if ( gen_CPP ) printf(" -\"CC\""); if ( strcmp(dlg_class,"DLGLexer")!=0 ) printf(" -cl %s", dlg_class); if ( strcmp(outdir,".")!=0 ) printf(" -o %s", outdir); printf(" $(DOTHER)"); printf("\n"); printf("GRM = "); pfiles(files, n, NULL); printf("\n"); printf("SRC = "); if ( gen_CPP ) pfiles(files, n, CPP_FILE_SUFFIX_NO_DOT); else pfiles(files, n, "c"); if ( gen_CPP ) { printf(" ,-\n "); printf(" "); pclasses(classes, num_classes, CPP_FILE_SUFFIX_NO_DOT); printf(" ,-\n "); printf("$(ANTLR_H)%s", APARSER_C); if ( !user_lexer ) printf(", $(ANTLR_H)%s", DLEXERBASE_C); if ( gen_trees ) { printf(" ,-\n "); printf("$(ANTLR_H)%s,", ASTBASE_C); printf(" $(ANTLR_H)%s", PCCTSAST_C); /* printf(" $(ANTLR_H)%s%s", DirectorySymbol, LIST_C); */ } printf(" ,-\n "); printf(" $(ANTLR_H)%s", ATOKENBUFFER_C); } if ( !user_lexer ) { if ( gen_CPP ) printf(", $(SCAN)%s", CPP_FILE_SUFFIX); else printf(", %s$(SCAN).c", DIR()); } if ( !gen_CPP ) printf(" $(ERR).c"); printf("\n"); printf("OBJ = "); pfiles(files, n, "obj"); if ( gen_CPP ) { printf(" ,-\n ");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -