genmms.c
来自「SRI international 发布的OAA框架软件」· C语言 代码 · 共 751 行 · 第 1/2 页
C
751 行
/*
* 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 <string.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 50
char *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 *);
void fatal(char*);
void warn(char*);
static void pClass(char*, char*);
void pclasses(char**, int, char*);
void help();
void mk(char*, char**, int, int, char**);
void pfiles(char**, int n, char*);
#else
static void ProcessArgs();
void fatal();
void warn();
void pClass();
void pclasses();
void help();
void mk();
void pfiles();
#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=='-' )
{
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 )
#else
void pClass( 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 )
#else
pDLGClass( 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 )
#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;
}
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;
}
void 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++;
}
}
void 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);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?