📄 lex.c
字号:
"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 + -