📄 lex.c
字号:
infname, inf_lnum, outf_lnum, msg); fprintf(logf, "Translation aborted.\n"); } closelogfile(); exit_failure();}void interror(proc, msg) /* does not return */char *proc, *msg;{ error(format_ss("Internal error in %s: %s", proc, msg));}void warning(msg)char *msg;{ if (checkeatnote(msg)) { if (verbose) fprintf(logf, "%s:%d:%d: Omitted warning: %s\n", infname, inf_lnum, outf_lnum, msg); return; } beginerror(); addnote(format_s("Warning: %s", msg), curserial); counterror();}void intwarning(proc, msg)char *proc, *msg;{ if (checkeatnote(msg)) { if (verbose) fprintf(logf, "%s:%d:%d: Omitted internal error in %s: %s\n", infname, inf_lnum, outf_lnum, proc, msg); return; } beginerror(); addnote(format_ss("Internal error in %s: %s", proc, msg), curserial); if (error_crash) exit_failure(); counterror();}void note(msg)char *msg;{ if (blockkind == TOK_IMPORT || checkeatnote(msg)) { if (verbose) fprintf(logf, "%s:%d:%d: Omitted note: %s\n", infname, inf_lnum, outf_lnum, msg); return; } beginerror(); addnote(format_s("Note: %s", msg), curserial); counterror();}void endnote(msg)char *msg;{ if (blockkind == TOK_IMPORT || checkeatnote(msg)) { if (verbose) fprintf(logf, "%s:%d:%d: Omitted end-note: %s\n", infname, inf_lnum, outf_lnum, msg); return; } if (verbose) fprintf(logf, "%s:%d:%d: Recorded end-note: %s\n", infname, inf_lnum, outf_lnum, msg); (void) strlist_add(&endnotelist, msg);}void showendnotes(){ while (initialcalls) { if (initialcalls->value) endnote(format_s("Remember to call %s in main program [215]", initialcalls->s)); strlist_eat(&initialcalls); } if (endnotelist) { end_source(); while (endnotelist) { if (!quietmode) { if (outf != stdout) { beginerror(); printf("Note: %s\n", endnotelist->s); } else fprintf(stderr, "Note: %s\n", endnotelist->s); } if (slashslash) fprintf(outf, "// p2c: Note: %s\n", endnotelist->s); else fprintf(outf, "/* p2c: Note: %s */\n", endnotelist->s); outf_lnum++; strlist_eat(&endnotelist); } }}char *tok_name(tok)Token tok;{ if (tok == TOK_END && inputkind == INP_STRLIST) return "end of macro"; if (tok == curtok && tok == TOK_IDENT) return format_s("'%s'", curtokcase); if (!modulenotation) { switch (tok) { case TOK_MODULE: return "UNIT"; case TOK_IMPORT: return "USES"; case TOK_EXPORT: return "INTERFACE"; case TOK_IMPLEMENT: return "IMPLEMENTATION"; default: break; } } return toknames[(int) tok];}void expected(msg)char *msg;{ error(format_ss("Expected %s, found %s", msg, tok_name(curtok)));}void expecttok(tok)Token tok;{ if (curtok != tok) expected(tok_name(tok));}void needtok(tok)Token tok;{ if (curtok != tok) expected(tok_name(tok)); gettok();}int wexpected(msg)char *msg;{ warning(format_ss("Expected %s, found %s [227]", msg, tok_name(curtok))); return 0;}int wexpecttok(tok)Token tok;{ if (curtok != tok) return wexpected(tok_name(tok)); else return 1;}int wneedtok(tok)Token tok;{ if (wexpecttok(tok)) { gettok(); return 1; } else return 0;}void alreadydef(sym)Symbol *sym;{ warning(format_s("Symbol '%s' was already defined [220]", sym->name));}void undefsym(sym)Symbol *sym;{ warning(format_s("Symbol '%s' is not defined [221]", sym->name));}void symclass(sym)Symbol *sym;{ warning(format_s("Symbol '%s' is not of the appropriate class [222]", sym->name));}void badtypes(){ warning("Type mismatch [223]");}void valrange(){ warning("Value range error [224]");}void skipparens(){ Token begintok; if (curtok == TOK_LPAR) { gettok(); while (curtok != TOK_RPAR) skipparens(); } else if (curtok == TOK_LBR) { gettok(); while (curtok != TOK_RBR) skipparens(); } else if (curtok == TOK_BEGIN || curtok == TOK_RECORD || curtok == TOK_CASE) { begintok = curtok; gettok(); while (curtok != TOK_END) if (curtok == TOK_CASE && begintok == TOK_RECORD) gettok(); else skipparens(); } gettok();}void skiptotoken2(tok1, tok2)Token tok1, tok2;{ while (curtok != tok1 && curtok != tok2 && curtok != TOK_END && curtok != TOK_RPAR && curtok != TOK_RBR && curtok != TOK_EOF) skipparens();}void skippasttoken2(tok1, tok2)Token tok1, tok2;{ skiptotoken2(tok1, tok2); if (curtok == tok1 || curtok == tok2) gettok();}void skippasttotoken(tok1, tok2)Token tok1, tok2;{ skiptotoken2(tok1, tok2); if (curtok == tok1) gettok();}void skiptotoken(tok)Token tok;{ skiptotoken2(tok, tok);}void skippasttoken(tok)Token tok;{ skippasttoken2(tok, tok);}int skipopenparen(){ if (wneedtok(TOK_LPAR)) return 1; skiptotoken(TOK_SEMI); return 0;}int skipcloseparen(){ if (curtok == TOK_COMMA) warning("Too many arguments for built-in routine [225]"); else if (wneedtok(TOK_RPAR)) return 1; skippasttotoken(TOK_RPAR, TOK_SEMI); return 0;}int skipcomma(){ if (curtok == TOK_RPAR) warning("Too few arguments for built-in routine [226]"); else if (wneedtok(TOK_COMMA)) return 1; skippasttotoken(TOK_RPAR, TOK_SEMI); return 0;}char *findaltname(name, num)char *name;int num;{ char *cp; if (num <= 0) return name; if (num == 1 && *alternatename1) return format_s(alternatename1, name); if (num == 2 && *alternatename2) return format_s(alternatename2, name); if (*alternatename) return format_sd(alternatename, name, num); cp = name; if (*alternatename1) { while (--num >= 0) cp = format_s(alternatename1, cp); } else { while (--num >= 0) cp = format_s("%s_", cp); } return cp;}Symbol *findsymbol_opt(name)char *name;{ register int i; register unsigned int hash; register char *cp; register Symbol *sp; hash = 0; for (cp = name; *cp; cp++) hash = hash*3 + *cp; sp = symtab[hash % SYMHASHSIZE]; while (sp && (i = strcmp(sp->name, name)) != 0) { if (i < 0) sp = sp->left; else sp = sp->right; } return sp;}Symbol *findsymbol(name)char *name;{ register int i; register unsigned int hash; register char *cp; register Symbol **prev, *sp; hash = 0; for (cp = name; *cp; cp++) hash = hash*3 + *cp; prev = symtab + (hash % SYMHASHSIZE); while ((sp = *prev) != 0 && (i = strcmp(sp->name, name)) != 0) { if (i < 0) prev = &(sp->left); else prev = &(sp->right); } if (!sp) { sp = ALLOCV(sizeof(Symbol) + strlen(name), Symbol, symbols); sp->mbase = sp->fbase = NULL; sp->left = sp->right = NULL; strcpy(sp->name, name); sp->flags = 0; sp->kwtok = TOK_NONE; sp->symbolnames = NULL; *prev = sp; } return sp;}void clearprogress(){ oldinfname = NULL;}void progress(){ char *ctxname; int needrefr; static int prevlen; if (showprogress) { if (!curctx || curctx == nullctx || curctx->kind == MK_MODULE || !strncmp(curctx->name, "__PROCPTR", 9) || blockkind == TOK_IMPORT) ctxname = ""; else ctxname = curctx->name; needrefr = (inf_lnum & 15) == 0; if (oldinfname != infname || oldctxname != ctxname) { if (oldinfname != infname) prevlen = 60; fprintf(stderr, "\r%*s", prevlen + 2, ""); oldinfname = infname; oldctxname = ctxname; needrefr = 1; } if (needrefr) { fprintf(stderr, "\r%5d %s %s", inf_lnum, infname, ctxname); prevlen = 8 + strlen(infname) + strlen(ctxname); } else { fprintf(stderr, "\r%5d", inf_lnum); prevlen = 5; } }}void replacestrings(buf, sl)char *buf;Strlist *sl;{ Strlist *p = sl; while (p) { char *cp = buf; char first = tolower(p->s[0]); char ufirst = toupper(p->s[0]); while (*cp) { if (*cp == first || *cp == ufirst) { char *cp1 = cp; char *cp2 = p->s; while (*cp2 && toupper(*cp1) == toupper(*cp2)) cp1++, cp2++; if (!*cp2) { int diff = strlen((char *)p->value) - strlen(p->s); if (diff > 0) { cp1 = cp + strlen(cp); while (cp1 >= cp) { cp1[diff] = *cp1; cp1--; } } else if (diff < 0) { while (*cp1) { cp1[diff] = *cp1; cp1++; } cp1[diff] = 0; } cp2 = (char *)p->value; while (*cp2) *cp++ = *cp2++; } else cp++; } else if (*cp == '\'') { while (*++cp && *cp != '\'') ; if (*cp) cp++; } else if (*cp == '"') { while (*++cp && *cp != '"') ; if (*cp) cp++; } else cp++; } p = p->next; }}void getline(){ char *cp, *cp2; switch (inputkind) { case INP_FILE: case INP_INCFILE: inf_lnum++; inf_ltotal++; if (fgets(inbuf, 300, inf)) { cp = inbuf + strlen(inbuf); if (*inbuf && cp[-1] == '\n') cp[-1] = 0; replacestrings(inbuf, replacebefore); if (inbuf[0] == '#' && inbuf[1] == ' ' && isdigit(inbuf[2])) { cp = inbuf + 2; /* in case input text came */ inf_lnum = 0; /* from the C preprocessor */ while (isdigit(*cp)) inf_lnum = inf_lnum*10 + (*cp++) - '0'; inf_lnum--; while (isspace(*cp)) cp++; if (*cp == '"' && (cp2 = my_strchr(cp+1, '"')) != NULL) { cp++; infname = stralloc(cp); infname[cp2 - cp] = 0; } getline(); return; } if (copysource && *inbuf) { start_source(); fprintf(outf, "%s\n", inbuf); } if (keepingstrlist) { strlist_append(keepingstrlist, inbuf)->value = inf_lnum; } if (showprogress && inf_lnum % showprogress == 0) progress(); } else { if (showprogress) fprintf(stderr, "\n");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -