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

📄 lex.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 2 页
字号:
	"MULLWV",	LLOGW, AMULLWV,	"MULLWCC",	LLOGW, AMULLWCC,	"MULLWVCC",	LLOGW, AMULLWVCC,	"MULHW",	LLOGW, AMULHW,	"MULHWCC",	LLOGW, AMULHWCC,	"MULHWU",	LLOGW, AMULHWU,	"MULHWUCC",	LLOGW, AMULHWUCC,	"NEG",		LABS, ANEG,	"NEGV",		LABS, ANEGV,	"NEGCC",	LABS, ANEGCC,	"NEGVCC",	LABS, ANEGVCC,	"NOP",		LNOP, ANOP,	/* ori 0,0,0 */	"SYSCALL",	LNOP, ASYSCALL,	"RETURN",	LRETRN, ARETURN,	"RFI",		LRETRN,	ARFI,	"RFCI",		LRETRN,	ARFCI,	"DATA",		LDATA, ADATA,	"END",		LEND, AEND,	"TEXT",		LTEXT, ATEXT,	/* IBM powerpc embedded  */	"MACCHW", LMA, AMACCHW,	"MACCHWCC", LMA, AMACCHWCC,	"MACCHWS", LMA, AMACCHWS,	"MACCHWSCC", LMA, AMACCHWSCC,	"MACCHWSU", LMA, AMACCHWSU,	"MACCHWSUCC", LMA, AMACCHWSUCC,	"MACCHWSUV", LMA, AMACCHWSUV,	"MACCHWSUVCC", LMA, AMACCHWSUVCC,	"MACCHWSV", LMA, AMACCHWSV,	"MACCHWSVCC", LMA, AMACCHWSVCC,	"MACCHWU", LMA, AMACCHWU,	"MACCHWUCC", LMA, AMACCHWUCC,	"MACCHWUV", LMA, AMACCHWUV,	"MACCHWUVCC", LMA, AMACCHWUVCC,	"MACCHWV", LMA, AMACCHWV,	"MACCHWVCC", LMA, AMACCHWVCC,	"MACHHW", LMA, AMACHHW,	"MACHHWCC", LMA, AMACHHWCC,	"MACHHWS", LMA, AMACHHWS,	"MACHHWSCC", LMA, AMACHHWSCC,	"MACHHWSU", LMA, AMACHHWSU,	"MACHHWSUCC", LMA, AMACHHWSUCC,	"MACHHWSUV", LMA, AMACHHWSUV,	"MACHHWSUVCC", LMA, AMACHHWSUVCC,	"MACHHWSV", LMA, AMACHHWSV,	"MACHHWSVCC", LMA, AMACHHWSVCC,	"MACHHWU", LMA, AMACHHWU,	"MACHHWUCC", LMA, AMACHHWUCC,	"MACHHWUV", LMA, AMACHHWUV,	"MACHHWUVCC", LMA, AMACHHWUVCC,	"MACHHWV", LMA, AMACHHWV,	"MACHHWVCC", LMA, AMACHHWVCC,	"MACLHW", LMA, AMACLHW,	"MACLHWCC", LMA, AMACLHWCC,	"MACLHWS", LMA, AMACLHWS,	"MACLHWSCC", LMA, AMACLHWSCC,	"MACLHWSU", LMA, AMACLHWSU,	"MACLHWSUCC", LMA, AMACLHWSUCC,	"MACLHWSUV", LMA, AMACLHWSUV,	"MACLHWSUVCC", LMA, AMACLHWSUVCC,	"MACLHWSV", LMA, AMACLHWSV,	"MACLHWSVCC", LMA, AMACLHWSVCC,	"MACLHWU", LMA, AMACLHWU,	"MACLHWUCC", LMA, AMACLHWUCC,	"MACLHWUV", LMA, AMACLHWUV,	"MACLHWUVCC", LMA, AMACLHWUVCC,	"MACLHWV", LMA, AMACLHWV,	"MACLHWVCC", LMA, AMACLHWVCC,	"MULCHW",	LLOGW, AMULCHW,	"MULCHWCC",	LLOGW, AMULCHWCC,	"MULCHWU",	LLOGW, AMULCHWU,	"MULCHWUCC",	LLOGW, AMULCHWUCC,	"MULHHW",	LLOGW, AMULHHW,	"MULHHWCC",	LLOGW, AMULHHWCC,	"MULHHWU",	LLOGW, AMULHHWU,	"MULHHWUCC",	LLOGW, AMULHHWUCC,	"MULLHW",	LLOGW, AMULLHW,	"MULLHWCC",	LLOGW, AMULLHWCC,	"MULLHWU",	LLOGW, AMULLHWU,	"MULLHWUCC",	LLOGW, AMULLHWUCC,	"NMACCHW", LMA, ANMACCHW,	"NMACCHWCC", LMA, ANMACCHWCC,	"NMACCHWS", LMA, ANMACCHWS,	"NMACCHWSCC", LMA, ANMACCHWSCC,	"NMACCHWSV", LMA, ANMACCHWSV,	"NMACCHWSVCC", LMA, ANMACCHWSVCC,	"NMACCHWV", LMA, ANMACCHWV,	"NMACCHWVCC", LMA, ANMACCHWVCC,	"NMACHHW", LMA, ANMACHHW,	"NMACHHWCC", LMA, ANMACHHWCC,	"NMACHHWS", LMA, ANMACHHWS,	"NMACHHWSCC", LMA, ANMACHHWSCC,	"NMACHHWSV", LMA, ANMACHHWSV,	"NMACHHWSVCC", LMA, ANMACHHWSVCC,	"NMACHHWV", LMA, ANMACHHWV,	"NMACHHWVCC", LMA, ANMACHHWVCC,	"NMACLHW", LMA, ANMACLHW,	"NMACLHWCC", LMA, ANMACLHWCC,	"NMACLHWS", LMA, ANMACLHWS,	"NMACLHWSCC", LMA, ANMACLHWSCC,	"NMACLHWSV", LMA, ANMACLHWSV,	"NMACLHWSVCC", LMA, ANMACLHWSVCC,	"NMACLHWV", LMA, ANMACLHWV,	"NMACLHWVCC", LMA, ANMACLHWVCC,/* special instructions */	"DCBF",		LXOP,	ADCBF,	"DCBI",		LXOP,	ADCBI,	"DCBST",	LXOP,	ADCBST,	"DCBT",		LXOP,	ADCBT,	"DCBTST",	LXOP,	ADCBTST,	"DCBZ",		LXOP,	ADCBZ,	"ICBI",		LXOP,	AICBI,	"ECIWX",	LXLD,	AECIWX,	"ECOWX",	LXST,	AECOWX,	"LWAR", LXLD, ALWAR,	"STWCCC", LXST, ASTWCCC,	"EIEIO",	LRETRN,	AEIEIO,	"TLBIE",	LNOP,	ATLBIE,	"LSW",	LXLD, ALSW,	"STSW",	LXST, ASTSW,		"ISYNC",	LRETRN, AISYNC,	"SYNC",		LRETRN, ASYNC,/*	"TW",		LADDW,	ATW,*/	"WORD",		LWORD, AWORD,	"SCHED",	LSCHED, 0,	"NOSCHED",	LSCHED,	0x80,	0};voidcinit(void){	Sym *s;	int i;	nullgen.sym = S;	nullgen.offset = 0;	nullgen.type = D_NONE;	nullgen.name = D_NONE;	nullgen.reg = NREG;	nullgen.xreg = NREG;	if(FPCHIP)		nullgen.dval = 0;	for(i=0; i<sizeof(nullgen.sval); i++)		nullgen.sval[i] = 0;	nerrors = 0;	iostack = I;	iofree = I;	peekc = IGN;	nhunk = 0;	for(i=0; i<NHASH; i++)		hash[i] = S;	for(i=0; itab[i].name; i++) {		s = slookup(itab[i].name);		s->type = itab[i].type;		s->value = itab[i].value;	}	ALLOCN(pathname, 0, 100);	if(mygetwd(pathname, 99) == 0) {		ALLOCN(pathname, 100, 900);		if(mygetwd(pathname, 999) == 0)			strcpy(pathname, "/???");	}}voidsyminit(Sym *s){	s->type = LNAME;	s->value = 0;}voidcclean(void){	outcode(AEND, &nullgen, NREG, &nullgen);	Bflush(&obuf);}voidzname(char *n, int t, int s){	Bputc(&obuf, ANAME);	Bputc(&obuf, t);	/* type */	Bputc(&obuf, s);	/* sym */	while(*n) {		Bputc(&obuf, *n);		n++;	}	Bputc(&obuf, 0);}voidzaddr(Gen *a, int s){	long l;	int i;	char *n;	Ieee e;	Bputc(&obuf, a->type);	Bputc(&obuf, a->reg);	Bputc(&obuf, s);	Bputc(&obuf, a->name);	switch(a->type) {	default:		print("unknown type %d\n", a->type);		exits("arg");	case D_NONE:	case D_REG:	case D_FREG:	case D_CREG:	case D_FPSCR:	case D_MSR:	case D_SREG:	case D_OPT:		break;	case D_DCR:	case D_SPR:	case D_OREG:	case D_CONST:	case D_BRANCH:		l = a->offset;		Bputc(&obuf, l);		Bputc(&obuf, l>>8);		Bputc(&obuf, l>>16);		Bputc(&obuf, l>>24);		break;	case D_SCONST:		n = a->sval;		for(i=0; i<NSNAME; i++) {			Bputc(&obuf, *n);			n++;		}		break;	case D_FCONST:		ieeedtod(&e, a->dval);		Bputc(&obuf, e.l);		Bputc(&obuf, e.l>>8);		Bputc(&obuf, e.l>>16);		Bputc(&obuf, e.l>>24);		Bputc(&obuf, e.h);		Bputc(&obuf, e.h>>8);		Bputc(&obuf, e.h>>16);		Bputc(&obuf, e.h>>24);		break;	}}intoutsim(Gen *g){	Sym *s;	int sno, t;	s = g->sym;	if(s == S)		return 0;	sno = s->sym;	if(sno < 0 || sno >= NSYM)		sno = 0;	t = g->name;	if(h[sno].type == t && h[sno].sym == s)		return sno;	zname(s->name, t, sym);	s->sym = sym;	h[sym].sym = s;	h[sym].type = t;	sno = sym;	sym++;	if(sym >= NSYM)		sym = 1;	return sno;}voidoutcode(int a, Gen *g1, int reg, Gen *g2){	int sf, st;	if(a != AGLOBL && a != ADATA)		pc++;	if(pass == 1)		return;	if(g1->xreg != NREG) {		if(reg != NREG || g2->xreg != NREG)			yyerror("bad addressing modes");		reg = g1->xreg;	} else	if(g2->xreg != NREG) {		if(reg != NREG)			yyerror("bad addressing modes");		reg = g2->xreg;	}	do {		sf = outsim(g1);		st = outsim(g2);	} while(sf != 0 && st == sf);	Bputc(&obuf, a);	Bputc(&obuf, reg|nosched);	Bputc(&obuf, lineno);	Bputc(&obuf, lineno>>8);	Bputc(&obuf, lineno>>16);	Bputc(&obuf, lineno>>24);	zaddr(g1, sf);	zaddr(g2, st);}voidoutgcode(int a, Gen *g1, int reg, Gen *g2, Gen *g3){	int s1, s2, s3, flag; 	if(a != AGLOBL && a != ADATA)		pc++;	if(pass == 1)		return;	do {		s1 = outsim(g1);		s2 = outsim(g2);		s3 = outsim(g3);	} while(s1 && (s2 && s1 == s2 || s3 && s1 == s3) || s2 && (s3 && s2 == s3));	flag = 0;	if(g2->type != D_NONE)		flag = 0x40;	/* flags extra operand */	Bputc(&obuf, a);	Bputc(&obuf, reg | nosched | flag);	Bputc(&obuf, lineno);	Bputc(&obuf, lineno>>8);	Bputc(&obuf, lineno>>16);	Bputc(&obuf, lineno>>24);	zaddr(g1, s1);	if(flag)		zaddr(g2, s2);	zaddr(g3, s3);}voidouthist(void){	Gen g;	Hist *h;	char *p, *q, *op, c;	int n;	g = nullgen;	c = pathchar();	for(h = hist; h != H; h = h->link) {		p = h->name;		op = 0;		/* on windows skip drive specifier in pathname */		if(systemtype(Windows) && p && p[1] == ':'){			p += 2;			c = *p;		}		if(p && p[0] != c && h->offset == 0 && pathname){			/* on windows skip drive specifier in pathname */			if(systemtype(Windows) && pathname[1] == ':') {				op = p;				p = pathname+2;				c = *p;			} else if(pathname[0] == c){				op = p;				p = pathname;			}		}		while(p) {			q = strchr(p, c);			if(q) {				n = q-p;				if(n == 0){					n = 1;	/* leading "/" */					*p = '/';	/* don't emit "\" on windows */				}				q++;			} else {				n = strlen(p);				q = 0;			}			if(n) {				Bputc(&obuf, ANAME);				Bputc(&obuf, D_FILE);	/* type */				Bputc(&obuf, 1);	/* sym */				Bputc(&obuf, '<');				Bwrite(&obuf, p, n);				Bputc(&obuf, 0);			}			p = q;			if(p == 0 && op) {				p = op;				op = 0;			}		}		g.offset = h->offset;		Bputc(&obuf, AHISTORY);		Bputc(&obuf, 0);		Bputc(&obuf, h->line);		Bputc(&obuf, h->line>>8);		Bputc(&obuf, h->line>>16);		Bputc(&obuf, h->line>>24);		zaddr(&nullgen, 0);		zaddr(&g, 0);	}}#include "../cc/lexbody"#include "../cc/macbody"#include "../cc/compat"

⌨️ 快捷键说明

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