⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 genmms.c

📁 本工具提供一个词法分析器和语法分析器的集成开发环境
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * 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 + -