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

📄 main.c

📁 含有BACKTARACKING的編譯軟體
💻 C
字号:
/* $Id: main.c,v 1.5 2004/03/28 19:52:10 tom Exp $ */#include <signal.h>#include "defs.h"char dflag;char lflag;char rflag;char tflag;char vflag;char *symbol_prefix;char *file_prefix = "y";char *myname = "yacc";char *temp_form = "yacc.XXXXXXX";int lineno;int outline;char *code_file_name;char *defines_file_name;char *input_file_name = "";char *output_file_name;char *verbose_file_name;FILE *action_file;	/*  a temp file, used to save actions associated    */			/*  with rules until the parser is written	    */FILE *code_file;	/*  y.code.c (used when the -r option is specified) */FILE *defines_file;	/*  y.tab.h					    */FILE *input_file;	/*  the input file				    */FILE *output_file;	/*  y.tab.c					    */FILE *text_file;	/*  a temp file, used to save text until all	    */			/*  symbols have been defined			    */FILE *union_file;	/*  a temp file, used to save the union		    */			/*  definition until all symbol have been	    */			/*  defined					    */FILE *verbose_file;	/*  y.output					    */int nitems;int nrules;int nsyms;int ntokens;int nvars;int   start_symbol;char  **symbol_name;short *symbol_value;short *symbol_prec;char  *symbol_assoc;short *ritem;short *rlhs;short *rrhs;short *rprec;char  *rassoc;short **derives;char *nullable;void done(int k){    if (action_file) fclose(action_file);    if (text_file) fclose(text_file);    if (union_file) fclose(union_file);    exit(k);}void onintr(int sig){    done(EXIT_FAILURE);}void set_signals(void){#ifdef SIGINT    if (signal(SIGINT, SIG_IGN) != SIG_IGN)	signal(SIGINT, onintr);#endif#ifdef SIGTERM    if (signal(SIGTERM, SIG_IGN) != SIG_IGN)	signal(SIGTERM, onintr);#endif#ifdef SIGHUP    if (signal(SIGHUP, SIG_IGN) != SIG_IGN)	signal(SIGHUP, onintr);#endif}void usage(void){    fprintf(stderr, "usage: %s [-dlrtv] [-b file_prefix] [-p symbol_prefix] filename\n", myname);    exit(1);}void getargs(int argc, char *argv[]){    register int i;    register char *s;    if (argc > 0) myname = argv[0];    for (i = 1; i < argc; ++i)    {	s = argv[i];	if (*s != '-') break;	switch (*++s)	{	case '\0':	    input_file = stdin;	    if (i + 1 < argc) usage();	    return;	case '-':	    ++i;	    goto no_more_options;	case 'b':	    if (*++s)		 file_prefix = s;	    else if (++i < argc)		file_prefix = argv[i];	    else		usage();	    continue;	case 'd':	    dflag = 1;	    break;	case 'l':	    lflag = 1;	    break;	case 'p':	    if (*++s)		symbol_prefix = s;	    else if (++i < argc)		symbol_prefix = argv[i];	    else		usage();	    continue;	case 'r':	    rflag = 1;	    break;	case 't':	    tflag = 1;	    break;	case 'v':	    vflag = 1;	    break;	default:	    usage();	}	for (;;)	{	    switch (*++s)	    {	    case '\0':		goto end_of_option;	    case 'd':		dflag = 1;		break;	    case 'l':		lflag = 1;		break;	    case 'r':		rflag = 1;		break;	    case 't':		tflag = 1;		break;	    case 'v':		vflag = 1;		break;	    default:		usage();	    }	}end_of_option:;    }no_more_options:;    if (i + 1 != argc) usage();    input_file_name = argv[i];}char *allocate(unsigned n){    register char *p;    p = NULL;    if (n)    {	p = CALLOC(1, n);	if (!p) no_space();    }    return (p);}void create_file_names(void){    int len;    len = strlen(file_prefix);    output_file_name = MALLOC(len + 7);    if (output_file_name == 0)	no_space();    strcpy(output_file_name, file_prefix);    strcpy(output_file_name + len, OUTPUT_SUFFIX);    if (rflag)    {	code_file_name = MALLOC(len + 8);	if (code_file_name == 0)	    no_space();	strcpy(code_file_name, file_prefix);	strcpy(code_file_name + len, CODE_SUFFIX);    }    else	code_file_name = output_file_name;    if (dflag)    {	defines_file_name = MALLOC(len + 7);	if (defines_file_name == 0)	    no_space();	strcpy(defines_file_name, file_prefix);	strcpy(defines_file_name + len, DEFINES_SUFFIX);    }    if (vflag)    {	verbose_file_name = MALLOC(len + 8);	if (verbose_file_name == 0)	    no_space();	strcpy(verbose_file_name, file_prefix);	strcpy(verbose_file_name + len, VERBOSE_SUFFIX);    }}void open_files(void){    create_file_names();    if (input_file == 0)    {	input_file = fopen(input_file_name, "r");	if (input_file == 0)	    open_error(input_file_name);    }    action_file = tmpfile();    if (action_file == 0)	open_error("action_file");    text_file = tmpfile();    if (text_file == 0)	open_error("text_file");    if (vflag)    {	verbose_file = fopen(verbose_file_name, "w");	if (verbose_file == 0)	    open_error(verbose_file_name);    }    if (dflag)    {	defines_file = fopen(defines_file_name, "w");	if (defines_file == 0)	    open_error(defines_file_name);	union_file = tmpfile();	if (union_file ==  0)	    open_error("union_file");    }    output_file = fopen(output_file_name, "w");    if (output_file == 0)	open_error(output_file_name);    if (rflag)    {	code_file = fopen(code_file_name, "w");	if (code_file == 0)	    open_error(code_file_name);    }    else	code_file = output_file;}intmain(int argc, char *argv[]){    getargs(argc, argv);    open_files();    reader();    lr0();    lalr();    make_parser();    verbose();    output();    done(0);    /*NOTREACHED*/}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -