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

📄 main.c

📁 Tinyc是很出名的C编译器开发实例
💻 C
字号:
/****************************************************/
/* File: main.c                                     */
/* Main program for TINY compiler                   */
/* Compiler Construction: Principles and Practice   */
/* Kenneth C. Louden                                */
/****************************************************/

#include "globals.h"

/* set NO_PARSE to TRUE to get a scanner-only compiler */
#define NO_PARSE FALSE
/* set NO_ANALYZE to TRUE to get a parser-only compiler */
#define NO_ANALYZE FALSE

/* set NO_CODE to TRUE to get a compiler that does not
 * generate code
 */
#define NO_CODE FALSE

#include "util.h"
#if NO_PARSE
    #include "scan.h"
#else
    #include "parse.h"
    #if !NO_ANALYZE
        #include "analyze.h"
        #if !NO_CODE
             #include "cgen.h"
        #endif
    #endif
#endif

/* allocate global variables */
int lineno = 0;
FILE * source;
FILE * listing;
FILE * code;

/* allocate and set tracing flags */
int EchoSource   = FALSE;
int TraceScan    = FALSE;
int TraceParse   = FALSE;
int TraceAnalyze = FALSE;
int TraceCode    = FALSE;

int Error = FALSE;

main( int argc, char * argv[] )
{
    TreeNode * syntaxTree;
    char pgm[120]; /* source code file name */
    if (argc != 2)
    { 
		fprintf(stderr,"usage: %s <filename>\n",argv[0]);
        exit(1);
    }

    strcpy(pgm,argv[1]) ;
    if (strchr (pgm, '.') == NULL)
       strcat(pgm,".tny");
    source = fopen(pgm,"r");
    if (source==NULL)
	{ 
		fprintf(stderr,"File %s not found\n",pgm);
        exit(1);
	}
    listing = stdout; /* send listing to screen */
    fprintf(listing,"\nTINY COMPILATION: %s\n",pgm);
    #if NO_PARSE
        while (getToken()!=ENDFILE);
    #else
        syntaxTree = parse();
  
	    if (TraceParse) 
		{
            fprintf(listing,"\nSyntax tree:\n");
            printTree(syntaxTree);
		}
        #if !NO_ANALYZE
            if (! Error)
			{ 
			    if (TraceAnalyze) 
				    fprintf(listing,"\nBuilding Symbol Table...\n");
                buildSymtab(syntaxTree);
                if (TraceAnalyze) 
				    fprintf(listing,"\nChecking Types...\n");
                typeCheck(syntaxTree);
                if (TraceAnalyze) 
				    fprintf(listing,"\nType Checking Finished\n");
			}
            #if !NO_CODE
                if (! Error)
				{ 
                    char * codefile;
                    int fnlen = strcspn(pgm,".");
                    codefile = (char *) calloc(fnlen+4, sizeof(char));
                    strncpy(codefile,pgm,fnlen);
                    strcat(codefile,".tm");
                    code = fopen(codefile,"w");
                    if (code == NULL)
					{ 
			            printf("Unable to open %s\n",codefile);
                        exit(1);
					}
                    codeGen(syntaxTree,codefile);
                    fclose(code);
				}
            #endif
        #endif
    #endif
    fclose(source);
    return 0;
}

⌨️ 快捷键说明

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