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

📄 lex.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 2 页
字号:
	"SETGT",	LTYPE1,	ASETGT,	"SETHI",	LTYPE1,	ASETHI,	"SETLE",	LTYPE1,	ASETLE,	"SETLS",	LTYPE1,	ASETLS,	"SETLT",	LTYPE1,	ASETLT,	"SETMI",	LTYPE1,	ASETMI,	"SETNE",	LTYPE1,	ASETNE,	"SETOC",	LTYPE1,	ASETOC,	"SETOS",	LTYPE1,	ASETOS,	"SETPC",	LTYPE1,	ASETPC,	"SETPL",	LTYPE1,	ASETPL,	"SETPS",	LTYPE1,	ASETPS,	"CDQ",		LTYPE0,	ACDQ,	"CWD",		LTYPE0,	ACWD,	"SHLB",		LTYPE3,	ASHLB,	"SHLL",		LTYPES,	ASHLL,	"SHLW",		LTYPES,	ASHLW,	"SHRB",		LTYPE3,	ASHRB,	"SHRL",		LTYPES,	ASHRL,	"SHRW",		LTYPES,	ASHRW,	"STC",		LTYPE0,	ASTC,	"STD",		LTYPE0,	ASTD,	"STI",		LTYPE0,	ASTI,	"STOSB",	LTYPE0,	ASTOSB,	"STOSL",	LTYPE0,	ASTOSL,	"STOSW",	LTYPE0,	ASTOSW,	"SUBB",		LTYPE3,	ASUBB,	"SUBL",		LTYPE3,	ASUBL,	"SUBW",		LTYPE3,	ASUBW,	"SYSCALL",	LTYPE0,	ASYSCALL,	"TESTB",	LTYPE3,	ATESTB,	"TESTL",	LTYPE3,	ATESTL,	"TESTW",	LTYPE3,	ATESTW,	"TEXT",		LTYPET,	ATEXT,	"VERR",		LTYPE2,	AVERR,	"VERW",		LTYPE2,	AVERW,	"WAIT",		LTYPE0,	AWAIT,	"WORD",		LTYPE2,	AWORD,	"XCHGB",	LTYPE3,	AXCHGB,	"XCHGL",	LTYPE3,	AXCHGL,	"XCHGW",	LTYPE3,	AXCHGW,	"XLAT",		LTYPE2,	AXLAT,	"XORB",		LTYPE3,	AXORB,	"XORL",		LTYPE3,	AXORL,	"XORW",		LTYPE3,	AXORW,	"FMOVB",	LTYPE3, AFMOVB,	"FMOVBP",	LTYPE3, AFMOVBP,	"FMOVD",	LTYPE3, AFMOVD,	"FMOVDP",	LTYPE3, AFMOVDP,	"FMOVF",	LTYPE3, AFMOVF,	"FMOVFP",	LTYPE3, AFMOVFP,	"FMOVL",	LTYPE3, AFMOVL,	"FMOVLP",	LTYPE3, AFMOVLP,	"FMOVV",	LTYPE3, AFMOVV,	"FMOVVP",	LTYPE3, AFMOVVP,	"FMOVW",	LTYPE3, AFMOVW,	"FMOVWP",	LTYPE3, AFMOVWP,	"FMOVX",	LTYPE3, AFMOVX,	"FMOVXP",	LTYPE3, AFMOVXP,	"FCOMB",	LTYPE3, AFCOMB,	"FCOMBP",	LTYPE3, AFCOMBP,	"FCOMD",	LTYPE3, AFCOMD,	"FCOMDP",	LTYPE3, AFCOMDP,	"FCOMDPP",	LTYPE3, AFCOMDPP,	"FCOMF",	LTYPE3, AFCOMF,	"FCOMFP",	LTYPE3, AFCOMFP,	"FCOML",	LTYPE3, AFCOML,	"FCOMLP",	LTYPE3, AFCOMLP,	"FCOMW",	LTYPE3, AFCOMW,	"FCOMWP",	LTYPE3, AFCOMWP,	"FUCOM",	LTYPE3, AFUCOM,	"FUCOMP",	LTYPE3, AFUCOMP,	"FUCOMPP",	LTYPE3, AFUCOMPP,	"FADDW",	LTYPE3, AFADDW,	"FADDL",	LTYPE3, AFADDL,	"FADDF",	LTYPE3, AFADDF,	"FADDD",	LTYPE3, AFADDD,	"FADDDP",	LTYPE3, AFADDDP,	"FSUBDP",	LTYPE3, AFSUBDP,	"FSUBW",	LTYPE3, AFSUBW,	"FSUBL",	LTYPE3, AFSUBL,	"FSUBF",	LTYPE3, AFSUBF,	"FSUBD",	LTYPE3, AFSUBD,	"FSUBRDP",	LTYPE3, AFSUBRDP,	"FSUBRW",	LTYPE3, AFSUBRW,	"FSUBRL",	LTYPE3, AFSUBRL,	"FSUBRF",	LTYPE3, AFSUBRF,	"FSUBRD",	LTYPE3, AFSUBRD,	"FMULDP",	LTYPE3, AFMULDP,	"FMULW",	LTYPE3, AFMULW,	"FMULL",	LTYPE3, AFMULL,	"FMULF",	LTYPE3, AFMULF,	"FMULD",	LTYPE3, AFMULD,	"FDIVDP",	LTYPE3, AFDIVDP,	"FDIVW",	LTYPE3, AFDIVW,	"FDIVL",	LTYPE3, AFDIVL,	"FDIVF",	LTYPE3, AFDIVF,	"FDIVD",	LTYPE3, AFDIVD,	"FDIVRDP",	LTYPE3, AFDIVRDP,	"FDIVRW",	LTYPE3, AFDIVRW,	"FDIVRL",	LTYPE3, AFDIVRL,	"FDIVRF",	LTYPE3, AFDIVRF,	"FDIVRD",	LTYPE3, AFDIVRD,	"FXCHD",	LTYPE3, AFXCHD,	"FFREE",	LTYPE1, AFFREE,	"FLDCW",	LTYPE2, AFLDCW,	"FLDENV",	LTYPE1, AFLDENV,	"FRSTOR",	LTYPE2, AFRSTOR,	"FSAVE",	LTYPE1, AFSAVE,	"FSTCW",	LTYPE1, AFSTCW,	"FSTENV",	LTYPE1, AFSTENV,	"FSTSW",	LTYPE1, AFSTSW,	"F2XM1",	LTYPE0, AF2XM1,	"FABS",		LTYPE0, AFABS,	"FCHS",		LTYPE0, AFCHS,	"FCLEX",	LTYPE0, AFCLEX,	"FCOS",		LTYPE0, AFCOS,	"FDECSTP",	LTYPE0, AFDECSTP,	"FINCSTP",	LTYPE0, AFINCSTP,	"FINIT",	LTYPE0, AFINIT,	"FLD1",		LTYPE0, AFLD1,	"FLDL2E",	LTYPE0, AFLDL2E,	"FLDL2T",	LTYPE0, AFLDL2T,	"FLDLG2",	LTYPE0, AFLDLG2,	"FLDLN2",	LTYPE0, AFLDLN2,	"FLDPI",	LTYPE0, AFLDPI,	"FLDZ",		LTYPE0, AFLDZ,	"FNOP",		LTYPE0, AFNOP,	"FPATAN",	LTYPE0, AFPATAN,	"FPREM",	LTYPE0, AFPREM,	"FPREM1",	LTYPE0, AFPREM1,	"FPTAN",	LTYPE0, AFPTAN,	"FRNDINT",	LTYPE0, AFRNDINT,	"FSCALE",	LTYPE0, AFSCALE,	"FSIN",		LTYPE0, AFSIN,	"FSINCOS",	LTYPE0, AFSINCOS,	"FSQRT",	LTYPE0, AFSQRT,	"FTST",		LTYPE0, AFTST,	"FXAM",		LTYPE0, AFXAM,	"FXTRACT",	LTYPE0, AFXTRACT,	"FYL2X",	LTYPE0, AFYL2X,	"FYL2XP1",	LTYPE0, AFYL2XP1,	0};voidcinit(void){	Sym *s;	int i;	nullgen.sym = S;	nullgen.offset = 0;	if(FPCHIP)		nullgen.dval = 0;	for(i=0; i<sizeof(nullgen.sval); i++)		nullgen.sval[i] = 0;	nullgen.type = D_NONE;	nullgen.index = D_NONE;	nullgen.scale = 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);		if(s->type != LNAME)			yyerror("double initialization %s", itab[i].name);		s->type = itab[i].type;		s->value = itab[i].value;	}	pathname = allocn(pathname, 0, 100);	if(mygetwd(pathname, 99) == 0) {		pathname = allocn(pathname, 100, 900);		if(mygetwd(pathname, 999) == 0)			strcpy(pathname, "/???");	}}voidcheckscale(int scale){	switch(scale) {	case 1:	case 2:	case 4:	case 8:		return;	}	yyerror("scale must be 1248: %d", scale);}voidsyminit(Sym *s){	s->type = LNAME;	s->value = 0;}voidcclean(void){	Gen2 g2;	g2.from = nullgen;	g2.to = nullgen;	outcode(AEND, &g2);	Bflush(&obuf);}voidzname(char *n, int t, int s){	Bputc(&obuf, ANAME);		/* as(2) */	Bputc(&obuf, ANAME>>8);	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, t;	char *n;	Ieee e;	t = 0;	if(a->index != D_NONE || a->scale != 0)		t |= T_INDEX;	if(a->offset != 0)		t |= T_OFFSET;	if(s != 0)		t |= T_SYM;	switch(a->type) {	default:		t |= T_TYPE;		break;	case D_FCONST:		t |= T_FCONST;		break;	case D_SCONST:		t |= T_SCONST;		break;	case D_NONE:		break;	}	Bputc(&obuf, t);	if(t & T_INDEX) {	/* implies index, scale */		Bputc(&obuf, a->index);		Bputc(&obuf, a->scale);	}	if(t & T_OFFSET) {	/* implies offset */		l = a->offset;		Bputc(&obuf, l);		Bputc(&obuf, l>>8);		Bputc(&obuf, l>>16);		Bputc(&obuf, l>>24);	}	if(t & T_SYM)		/* implies sym */		Bputc(&obuf, s);	if(t & T_FCONST) {		ieeedtod(&e, a->dval);		l = e.l;		Bputc(&obuf, l);		Bputc(&obuf, l>>8);		Bputc(&obuf, l>>16);		Bputc(&obuf, l>>24);		l = e.h;		Bputc(&obuf, l);		Bputc(&obuf, l>>8);		Bputc(&obuf, l>>16);		Bputc(&obuf, l>>24);		return;	}	if(t & T_SCONST) {		n = a->sval;		for(i=0; i<NSNAME; i++) {			Bputc(&obuf, *n);			n++;		}		return;	}	if(t & T_TYPE)		Bputc(&obuf, a->type);}voidoutcode(int a, Gen2 *g2){	int sf, st, t;	Sym *s;	if(pass == 1)		goto out;jackpot:	sf = 0;	s = g2->from.sym;	while(s != S) {		sf = s->sym;		if(sf < 0 || sf >= NSYM)			sf = 0;		t = g2->from.type;		if(t == D_ADDR)			t = g2->from.index;		if(h[sf].type == t)		if(h[sf].sym == s)			break;		zname(s->name, t, sym);		s->sym = sym;		h[sym].sym = s;		h[sym].type = t;		sf = sym;		sym++;		if(sym >= NSYM)			sym = 1;		break;	}	st = 0;	s = g2->to.sym;	while(s != S) {		st = s->sym;		if(st < 0 || st >= NSYM)			st = 0;		t = g2->to.type;		if(t == D_ADDR)			t = g2->to.index;		if(h[st].type == t)		if(h[st].sym == s)			break;		zname(s->name, t, sym);		s->sym = sym;		h[sym].sym = s;		h[sym].type = t;		st = sym;		sym++;		if(sym >= NSYM)			sym = 1;		if(st == sf)			goto jackpot;		break;	}	Bputc(&obuf, a);	Bputc(&obuf, a>>8);	Bputc(&obuf, lineno);	Bputc(&obuf, lineno>>8);	Bputc(&obuf, lineno>>16);	Bputc(&obuf, lineno>>24);	zaddr(&g2->from, sf);	zaddr(&g2->to, st);out:	if(a != AGLOBL && a != ADATA)		pc++;}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, ANAME>>8);				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, AHISTORY>>8);		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 + -