📄 lex.c
字号:
"FSINF", LTYPE1, AFSINF, "FSINHB", LTYPE1, AFSINHB, "FSINHD", LTYPE1, AFSINHD, "FSINHF", LTYPE1, AFSINHF, "FSINHL", LTYPE1, AFSINHL, "FSINHW", LTYPE1, AFSINHW, "FSINL", LTYPE1, AFSINL, "FSINW", LTYPE1, AFSINW, "FSLE", LTYPE1, AFSLE, "FSLT", LTYPE1, AFSLT, "FSNE", LTYPE1, AFSNE, "FSQRTB", LTYPE1, AFSQRTB, "FSQRTD", LTYPE1, AFSQRTD, "FSQRTF", LTYPE1, AFSQRTF, "FSQRTL", LTYPE1, AFSQRTL, "FSQRTW", LTYPE1, AFSQRTW, "FST", LTYPE1, AFST, "FSUBB", LTYPE1, AFSUBB, "FSUBD", LTYPE1, AFSUBD, "FSUBF", LTYPE1, AFSUBF, "FSUBL", LTYPE1, AFSUBL, "FSUBW", LTYPE1, AFSUBW, "FTANB", LTYPE1, AFTANB, "FTAND", LTYPE1, AFTAND, "FTANF", LTYPE1, AFTANF, "FTANHB", LTYPE1, AFTANHB, "FTANHD", LTYPE1, AFTANHD, "FTANHF", LTYPE1, AFTANHF, "FTANHL", LTYPE1, AFTANHL, "FTANHW", LTYPE1, AFTANHW, "FTANL", LTYPE1, AFTANL, "FTANW", LTYPE1, AFTANW, "FTENTOXB", LTYPE1, AFTENTOXB, "FTENTOXD", LTYPE1, AFTENTOXD, "FTENTOXF", LTYPE1, AFTENTOXF, "FTENTOXL", LTYPE1, AFTENTOXL, "FTENTOXW", LTYPE1, AFTENTOXW, "FTSTB", LTYPE1, AFTSTB, "FTSTD", LTYPE1, AFTSTD, "FTSTF", LTYPE1, AFTSTF, "FTSTL", LTYPE1, AFTSTL, "FTSTW", LTYPE1, AFTSTW, "FTWOTOXB", LTYPE1, AFTWOTOXB, "FTWOTOXD", LTYPE1, AFTWOTOXD, "FTWOTOXF", LTYPE1, AFTWOTOXF, "FTWOTOXL", LTYPE1, AFTWOTOXL, "FTWOTOXW", LTYPE1, AFTWOTOXW, "FMOVEM", LTYPE1, AFMOVEM, "FMOVEMC", LTYPE1, AFMOVEMC, "FRESTORE", LTYPE3, AFRESTORE, "FSAVE", LTYPE3, AFSAVE, "GLOBL", LTYPE1, AGLOBL, "GOK", LTYPE2, AGOK, "HISTORY", LTYPE2, AHISTORY, "ILLEG", LTYPE2, AILLEG, "INSTR", LTYPE3, AINSTR, "JMP", LTYPE3, AJMP, "JSR", LTYPE3, AJSR, "LEA", LTYPE1, ALEA, "LINKL", LTYPE1, ALINKL, "LINKW", LTYPE1, ALINKW, "LOCATE", LTYPE1, ALOCATE, "LONG", LTYPE3, ALONG, "LSLB", LTYPE1, ALSLB, "LSLL", LTYPE1, ALSLL, "LSLW", LTYPE1, ALSLW, "LSRB", LTYPE1, ALSRB, "LSRL", LTYPE1, ALSRL, "LSRW", LTYPE1, ALSRW, "MOVB", LTYPE1, AMOVB, "MOVEM", LTYPE1, AMOVEM, "MOVEPL", LTYPE1, AMOVEPL, "MOVEPW", LTYPE1, AMOVEPW, "MOVESB", LTYPE1, AMOVESB, "MOVESL", LTYPE1, AMOVESL, "MOVESW", LTYPE1, AMOVESW, "MOVL", LTYPE1, AMOVL, "MOVW", LTYPE1, AMOVW, "MULSL", LTYPE1, AMULSL, "MULSW", LTYPE1, AMULSW, "MULUL", LTYPE1, AMULUL, "MULUW", LTYPE1, AMULUW, "NAME", LTYPE1, ANAME, "NBCD", LTYPE3, ANBCD, "NEGB", LTYPE3, ANEGB, "NEGL", LTYPE3, ANEGL, "NEGW", LTYPE3, ANEGW, "NEGXB", LTYPE3, ANEGXB, "NEGXL", LTYPE3, ANEGXL, "NEGXW", LTYPE3, ANEGXW, "NOP", LTYPE9, ANOP, "NOTB", LTYPE3, ANOTB, "NOTL", LTYPE3, ANOTL, "NOTW", LTYPE3, ANOTW, "ORB", LTYPE1, AORB, "ORL", LTYPE1, AORL, "ORW", LTYPE1, AORW, "PACK", LTYPE1, APACK, "PEA", LTYPE3, APEA, "RESET", LTYPE2, ARESET, "ROTLB", LTYPE1, AROTLB, "ROTLL", LTYPE1, AROTLL, "ROTLW", LTYPE1, AROTLW, "ROTRB", LTYPE1, AROTRB, "ROTRL", LTYPE1, AROTRL, "ROTRW", LTYPE1, AROTRW, "ROXLB", LTYPE1, AROXLB, "ROXLL", LTYPE1, AROXLL, "ROXLW", LTYPE1, AROXLW, "ROXRB", LTYPE1, AROXRB, "ROXRL", LTYPE1, AROXRL, "ROXRW", LTYPE1, AROXRW, "RTD", LTYPE3, ARTD, "RTE", LTYPE2, ARTE, "RTM", LTYPE3, ARTM, "RTR", LTYPE2, ARTR, "RTS", LTYPE2, ARTS, "SBCD", LTYPE1, ASBCD, "SCC", LTYPE3, ASCC, "SCS", LTYPE3, ASCS, "SEQ", LTYPE3, ASEQ, "SF", LTYPE3, ASF, "SGE", LTYPE3, ASGE, "SGT", LTYPE3, ASGT, "SHI", LTYPE3, ASHI, "SLE", LTYPE3, ASLE, "SLS", LTYPE3, ASLS, "SLT", LTYPE3, ASLT, "SMI", LTYPE3, ASMI, "SNE", LTYPE3, ASNE, "SPL", LTYPE3, ASPL, "ST", LTYPE3, AST, "STOP", LTYPE3, ASTOP, "SUBB", LTYPE1, ASUBB, "SUBL", LTYPE1, ASUBL, "SUBW", LTYPE1, ASUBW, "SUBXB", LTYPE1, ASUBXB, "SUBXL", LTYPE1, ASUBXL, "SUBXW", LTYPE1, ASUBXW, "SVC", LTYPE2, ASVC, "SVS", LTYPE2, ASVS, "SWAP", LTYPE3, ASWAP, "SYS", LTYPE2, ASYS, "TAS", LTYPE3, ATAS, "TEXT", LTYPEB, ATEXT, "TRAP", LTYPE3, ATRAP, "TRAPCC", LTYPE2, ATRAPCC, "TRAPCS", LTYPE2, ATRAPCS, "TRAPEQ", LTYPE2, ATRAPEQ, "TRAPF", LTYPE2, ATRAPF, "TRAPGE", LTYPE2, ATRAPGE, "TRAPGT", LTYPE2, ATRAPGT, "TRAPHI", LTYPE2, ATRAPHI, "TRAPLE", LTYPE2, ATRAPLE, "TRAPLS", LTYPE2, ATRAPLS, "TRAPLT", LTYPE2, ATRAPLT, "TRAPMI", LTYPE2, ATRAPMI, "TRAPNE", LTYPE2, ATRAPNE, "TRAPPL", LTYPE2, ATRAPPL, "TRAPT", LTYPE2, ATRAPT, "TRAPV", LTYPE2, ATRAPV, "TRAPVC", LTYPE2, ATRAPVC, "TRAPVS", LTYPE2, ATRAPVS, "TSTB", LTYPE3, ATSTB, "TSTL", LTYPE3, ATSTL, "TSTW", LTYPE3, ATSTW, "UNLK", LTYPE3, AUNLK, "UNPK", LTYPE1, AUNPK, "WORD", LTYPE3, AWORD, 0};voidcinit(void){ Sym *s; int i; nullgen.sym = S; nullgen.offset = 0; nullgen.type = D_NONE; if(FPCHIP) nullgen.dval = 0; for(i=0; i<sizeof(nullgen.sval); i++) nullgen.sval[i] = 0; nullgen.displace = 0; nullgen.type = D_NONE; nullgen.index = D_NONE; nullgen.scale = 0; nullgen.field = 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; } pathname = allocn(pathname, 0, 100); if(mygetwd(pathname, 99) == 0) { pathname = allocn(pathname, 100, 900); if(mygetwd(pathname, 999) == 0) strcpy(pathname, "/???"); }}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 */ 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->field) t |= T_FIELD; if(a->index != D_NONE || a->displace != 0) t |= T_INDEX; if(a->offset != 0) t |= T_OFFSET; if(s != 0) t |= T_SYM; if(a->type == D_FCONST) t |= T_FCONST; else if(a->type == D_SCONST) t |= T_SCONST; else if(a->type & ~0xff) t |= T_TYPE; Bputc(&obuf, t); if(t & T_FIELD) { /* implies field */ i = a->field; Bputc(&obuf, i); Bputc(&obuf, i>>8); } if(t & T_INDEX) { /* implies index, scale, displace */ i = a->index; Bputc(&obuf, i); Bputc(&obuf, i>>8); Bputc(&obuf, a->scale); l = a->displace; Bputc(&obuf, l); Bputc(&obuf, l>>8); Bputc(&obuf, l>>16); Bputc(&obuf, l>>24); } 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; } i = a->type; Bputc(&obuf, i); if(t & T_TYPE) Bputc(&obuf, i>>8);}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 & D_MASK; 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 & D_MASK; 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 + -