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

📄 norm2.c

📁 c 语言编译器 源代码- c compiler
💻 C
字号:
/* @(#) norm2.c 1.3 1/27/86 17:49:18 */ /*ident	"@(#)cfront:src/norm2.c	1.3" *//************************************************************************	C++ source for cfront, the C++ compiler front-end	written in the computer science research center of Bell Labs	Copyright (c) 1984 AT&T, Inc. All Rights Reserved	THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T, INC.norm2.c:	"normalization" handles problems which could have been handled	by the syntax analyser; but has not been done. The idea is	to simplify the grammar and the actions accociated with it,	and to get a more robust error handling****************************************************************************/#include "cfront.h"#include "size.h"extern char* malloc(int);fct.fct(Ptype t, Pname arg, TOK known){	Nt++;	base = FCT;	nargs_known = known;	returns = t;	argtype = arg; /*fprintf(stderr,"fct t %d %d arg %d %d -> %d\n",t, t?t->base:0, arg, arg?arg->base:0, this);*/	if (arg==0 || arg->base==ELIST) return;	register Pname n;	for (n=arg; n; n=n->n_list) {		switch (n->tp->base) {		case VOID:			argtype = 0;			nargs = 0;			nargs_known = 1;			if (n->string)				error("voidFA%n",n);			else if (nargs || n->n_list) {				error("voidFA");				nargs_known = 0;			}			break;		case CLASS:		case ENUM:			break;		default:			nargs++;		}	}}Pexpr expr_free;#define EBITE 250expr.expr(TOK ba, Pexpr a, Pexpr b){	register Pexpr p;	if (this) goto ret;	if ( (p=expr_free) == 0 ) {		register Pexpr q = (Pexpr) malloc(EBITE*sizeof(class expr));		for (p=expr_free=&q[EBITE-1]; q<p; p--) p->e1 = p-1;		(p+1)->e1 = 0;/*fprintf(stderr, "malloc %d expr_free=%d p+1=%d\n", EBITE*sizeof(class expr), expr_free, p+1);*/	}	else		expr_free = p->e1;	/* beware of alignment differences */	if ( sizeof(expr)&1 ) {		register char* pp = (char*)(p+1);		while ( (char*)p<pp) *--pp = 0;	}	else if (sizeof(expr)&2 ) {		register short* pp = (short*)(p+1);		while ( (short*)p<pp ) *--pp = 0;	}	else {		register int* pp = (int*)(p+1);		while ( (int*)p<pp ) *--pp = 0;	}	this = p;/*fprintf(stderr,"expr.ctor(%d,%d,%d)->%d\n",ba,a,b,this); fflush(stderr);*/ret:	Ne++;	base = ba;	e1 = a;	e2 = b;}expr.~expr(){	NFe++;/*fprintf(stderr,"%d->expr.dtor(%d %d %d)\n",this,base,e1,e2); */	e1 = expr_free;	expr_free = this;	this = 0;}Pstmt stmt_free;#define SBITE 250stmt.stmt(TOK ba, loc ll, Pstmt a){	register Pstmt p;	if ( (p=stmt_free) == 0 ) {		register Pstmt q = (Pstmt) malloc(SBITE*sizeof(class stmt));		for (p=stmt_free=&q[SBITE-1]; q<p; p--) p->s_list = p-1;		(p+1)->s_list = 0;	}	else		stmt_free = p->s_list;	/* beware of alignment differences */	if ( sizeof(stmt)&1 ) {		register char* pp = (char*)(p+1);		while ( (char*)p<pp) *--pp = 0;	}	else if (sizeof(stmt)&2 ) {		register short* pp = (short*)(p+1);		while ( (short*)p<pp ) *--pp = 0;	}	else {		register int* pp = (int*)(p+1);		while ( (int*)p<pp ) *--pp = 0;	}	this = p;	Ns++;	base=ba;	where = ll;	s=a;}stmt.~stmt(){	NFs++;	s_list = stmt_free;	stmt_free = this;	this = 0;}classdef.classdef(TOK b, Pname n){	base = CLASS;	csu = b;	pubmem = n;	memtbl = new table(CTBLSIZE,0,0);}basetype.basetype(TOK b, Pname n){/*fprintf(stderr,"%d->basetype.basetype(%d %d)\n",this,b,n);*/	Nbt++;	switch (b) {	case 0:				break;	case TYPEDEF:	b_typedef = 1;	break;	case INLINE:	b_inline = 1;	break;	case VIRTUAL:	b_virtual = 1;	break;	case CONST:	b_const = 1;	break;	case UNSIGNED:	b_unsigned = 1;	break;	case FRIEND:	case OVERLOAD:	case EXTERN:	case STATIC:	case AUTO:	case REGISTER:	b_sto = b;	break;	case SHORT:	b_short = 1;	break;	case LONG:	b_long = 1;	break;	case ANY:	case ZTYPE:	case VOID:	case CHAR:	case INT:	case FLOAT:	case DOUBLE:	base = b; 	break;	case TYPE:	case COBJ:	case EOBJ:	case FIELD:	case ASM:		base = b;		b_name = n;		break;	default:		error('i',"badBT:%k",b);	}}#define NBITE 250Pname name_free;name.name(char* s) : (NAME,0,0){	register Pname p;	if ( (p=name_free) == 0 ) {		register Pname q = (Pname) malloc(NBITE*sizeof(class name));		for (p=name_free=&q[NBITE-1]; q<p; p--) p->n_tbl_list = p-1;		(p+1)->n_tbl_list = 0;/*fprintf(stderr, "malloc %d name_free=%d p+1=%d\n", NBITE*sizeof(class name), name_free, p+1); */	}	else		name_free = p->n_tbl_list;	/* beware of alignment differences */	if ( sizeof(name)&1 ) {		register char* pp = (char*)(p+1);		while ( (char*)p<pp) *--pp = 0;	}	else if (sizeof(name)&2 ) {		register short* pp = (short*)(p+1);		while ( (short*)p<pp ) *--pp = 0;	}	else {		register int* pp = (int*)(p+1);		while ( (int*)p<pp ) *--pp = 0;	}	this = p;//fprintf(stderr,"%d: new name %s %d ll %d bl %d\n",this,s,base,lex_level,bl_level);	Nn++;	string = s;	where = curloc;	lex_level = bl_level;}name.~name(){	NFn++;/*fprintf(stderr,"delete %d: %s %d\n",this,string,base);*/	n_tbl_list = name_free;	name_free = this;	this = 0;}nlist.nlist(Pname n){	Pname nn;	if (n==0) error('i',"nlist.nlist(0)");	head = n;	for (nn=n; nn->n_list; nn=nn->n_list);	tail = nn;	Nl++;}void nlist.add_list(Pname n){	if (n->tp->defined & IN_ERROR) return;	Pname nn;	tail->n_list = n;	for (nn=n; nn->n_list; nn=nn->n_list);	tail = nn;}int NFl;Pname name_unlist(class nlist * l){	Pname n;	if (l == 0) return 0;	n = l->head;	NFl++;	delete l;	return n;}Pstmt stmt_unlist(class slist * l){	Pstmt s;	if (l == 0) return 0;	s = l->head;	NFl++;	delete l;	return s;}Pexpr expr_unlist(class elist * l){	Pexpr e;	if (l == 0) return 0;	e = l->head;	NFl++;	delete l;	return e;}

⌨️ 快捷键说明

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