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

📄 lex.c

📁 把pascal程序转成C语言程序 把pascal程序转成C语言程序
💻 C
📖 第 1 页 / 共 5 页
字号:
                if (inputkind == INP_INCFILE) {                    pop_input();                    getline();                } else                    strcpy(inbuf, "\001");            }            break;        case INP_STRLIST:            if (instrlist) {                strcpy(inbuf, instrlist->s);                if (instrlist->value)                    inf_lnum = instrlist->value;                else                    inf_lnum++;                instrlist = instrlist->next;            } else                strcpy(inbuf, "\001");            break;    }    inbufptr = inbuf;    inbufindent = 0;}Static void push_input(){    struct inprec *inp;    inp = ALLOC(1, struct inprec, inprecs);    inp->kind = inputkind;    inp->fname = infname;    inp->lnum = inf_lnum;    inp->filep = inf;    inp->strlistp = instrlist;    inp->inbufptr = stralloc(inbufptr);    inp->curtok = curtok;    inp->curtoksym = curtoksym;    inp->curtokmeaning = curtokmeaning;    inp->curtokbuf = stralloc(curtokbuf);    inp->curtokcase = stralloc(curtokcase);    inp->saveblockkind = TOK_NIL;    inp->next = topinput;    topinput = inp;    inbufptr = inbuf + strlen(inbuf);}void push_input_file(fp, fname, isinclude)FILE *fp;char *fname;int isinclude;{    push_input();    inputkind = (isinclude == 1) ? INP_INCFILE : INP_FILE;    inf = fp;    inf_lnum = 0;    infname = fname;    *inbuf = 0;    inbufptr = inbuf;    topinput->tempopts = tempoptionlist;    tempoptionlist = NULL;    if (isinclude != 2)        gettok();}void include_as_import(){    if (inputkind == INP_INCFILE) {	if (topinput->saveblockkind == TOK_NIL)	    topinput->saveblockkind = blockkind;	blockkind = TOK_IMPORT;    } else	warning(format_s("%s ignored except in include files [228]",			 interfacecomment));}void push_input_strlist(sp, fname)Strlist *sp;char *fname;{    push_input();    inputkind = INP_STRLIST;    instrlist = sp;    if (fname) {        infname = fname;        inf_lnum = 0;    } else        inf_lnum--;     /* adjust for extra getline() */    *inbuf = 0;    inbufptr = inbuf;    gettok();}void pop_input(){    struct inprec *inp;    if (inputkind == INP_FILE || inputkind == INP_INCFILE) {	while (tempoptionlist) {	    undooption(tempoptionlist->value, tempoptionlist->s);	    strlist_eat(&tempoptionlist);	}	tempoptionlist = topinput->tempopts;	if (inf)	    fclose(inf);    }    inp = topinput;    topinput = inp->next;    if (inp->saveblockkind != TOK_NIL)	blockkind = inp->saveblockkind;    inputkind = inp->kind;    infname = inp->fname;    inf_lnum = inp->lnum;    inf = inp->filep;    curtok = inp->curtok;    curtoksym = inp->curtoksym;    curtokmeaning = inp->curtokmeaning;    strcpy(curtokbuf, inp->curtokbuf);    FREE(inp->curtokbuf);    strcpy(curtokcase, inp->curtokcase);    FREE(inp->curtokcase);    strcpy(inbuf, inp->inbufptr);    FREE(inp->inbufptr);    inbufptr = inbuf;    instrlist = inp->strlistp;    FREE(inp);}int undooption(i, name)int i;char *name;{    char kind = rctable[i].kind;    switch (kind) {        case 'S':	case 'B':	    if (rcprevvalues[i]) {                *((short *)rctable[i].ptr) = rcprevvalues[i]->value;                strlist_eat(&rcprevvalues[i]);                return 1;            }            break;        case 'I':        case 'D':            if (rcprevvalues[i]) {                *((int *)rctable[i].ptr) = rcprevvalues[i]->value;                strlist_eat(&rcprevvalues[i]);                return 1;            }            break;        case 'L':            if (rcprevvalues[i]) {                *((long *)rctable[i].ptr) = rcprevvalues[i]->value;                strlist_eat(&rcprevvalues[i]);                return 1;            }            break;	case 'R':	    if (rcprevvalues[i]) {		*((double *)rctable[i].ptr) = atof(rcprevvalues[i]->s);		strlist_eat(&rcprevvalues[i]);		return 1;	    }	    break;        case 'C':        case 'U':            if (rcprevvalues[i]) {                strcpy((char *)rctable[i].ptr, rcprevvalues[i]->s);                strlist_eat(&rcprevvalues[i]);                return 1;            }            break;        case 'A':            strlist_remove((Strlist **)rctable[i].ptr, name);            return 1;        case 'X':            if (rctable[i].def == 1 || rctable[i].def == 4) {                strlist_remove((Strlist **)rctable[i].ptr, name);                return 1;            }            break;    }    return 0;}void badinclude(){    warning("Can't handle an \"include\" directive here [229]");    inputkind = INP_INCFILE;     /* expand it in-line */    gettok();}int handle_include(fn)char *fn;{    FILE *fp = NULL;    Strlist *sl;    for (sl = includedirs; sl; sl = sl->next) {	fp = fopen(format_s(sl->s, fn), "r");	if (fp) {	    fn = stralloc(format_s(sl->s, fn));	    break;	}    }    if (!fp) {        perror(fn);        warning(format_s("Could not open include file %s [230]", fn));        return 0;    } else {        if (!quietmode && !showprogress)	    if (outf == stdout)		fprintf(stderr, "Reading include file \"%s\"\n", fn);	    else		printf("Reading include file \"%s\"\n", fn);	if (verbose)	    fprintf(logf, "Reading include file \"%s\"\n", fn);        if (expandincludes == 0) {            push_input_file(fp, fn, 2);            curtok = TOK_INCLUDE;            strcpy(curtokbuf, fn);        } else {            push_input_file(fp, fn, 1);        }        return 1;    }}int turbo_directive(closing, after)char *closing, *after;{    char *cp, *cp2;    int i, result;    if (!strcincmp(inbufptr, "$double", 7)) {	cp = inbufptr + 7;	while (isspace(*cp)) cp++;	if (cp == closing) {	    inbufptr = after;	    doublereals = 1;	    return 1;	}    } else if (!strcincmp(inbufptr, "$nodouble", 9)) {	cp = inbufptr + 9;	while (isspace(*cp)) cp++;	if (cp == closing) {	    inbufptr = after;	    doublereals = 0;	    return 1;	}    } else if (!strcincmp(inbufptr, "$no object", 10)) {	cp = inbufptr + 10;	while (isspace(*cp)) cp++;	if (cp == closing) {	    inbufptr = after;	    nullbody = 1;	    return 1;	}    } else if (!strcincmp(inbufptr, "$nullbody", 9)) {	cp = inbufptr + 9;	while (isspace(*cp)) cp++;	if (cp == closing) {	    inbufptr = after;	    nullbody = 1;	    return 1;	}    }    switch (inbufptr[2]) {        case '+':        case '-':            result = 1;            cp = inbufptr + 1;            for (;;) {                if (!isalpha(*cp++))                    return 0;                if (*cp != '+' && *cp != '-')                    return 0;                if (++cp == closing)                    break;                if (*cp++ != ',')                    return 0;            }            cp = inbufptr + 1;            do {                switch (*cp++) {                    case 'b':                    case 'B':                        if (shortcircuit < 0 && which_lang != LANG_MPW)                            partial_eval_flag = (*cp == '-');                        break;                    case 'i':                    case 'I':                        iocheck_flag = (*cp == '+');                        break;                    case 'r':                    case 'R':                        if (*cp == '+') {                            if (!range_flag)                                note("Range checking is ON [216]");                            range_flag = 1;                        } else {                            if (range_flag)                                note("Range checking is OFF [216]");                            range_flag = 0;                        }                        break;                    case 's':                    case 'S':                        if (*cp == '+') {                            if (!stackcheck_flag)                                note("Stack checking is ON [217]");                            stackcheck_flag = 1;                        } else {                            if (stackcheck_flag)                                note("Stack checking is OFF [217]");                            stackcheck_flag = 0;                        }                        break;                    default:                        result = 0;                        break;                }                cp++;            } while (*cp++ == ',');            if (result)                inbufptr = after;            return result;	case 'c':	case 'C':	    if (toupper(inbufptr[1]) == 'S' &&		(inbufptr[3] == '+' || inbufptr[3] == '-') &&		inbufptr + 4 == closing) {		if (shortcircuit < 0)		    partial_eval_flag = (inbufptr[3] == '+');		inbufptr = after;		return 1;	    }	    return 0;        case '=':	    switch (inbufptr[1]) {	        case 'f':	        case 'F':		    goto do_include;	    }	    return 0;        case ' ':            switch (inbufptr[1]) {                case 'i':                case 'I':		do_include:                    if (skipping_module)                        break;                    cp = inbufptr + 3;                    while (isspace(*cp)) cp++;                    cp2 = cp;                    i = 0;                    while (*cp2 && cp2 != closing)                        i++, cp2++;                    if (cp2 != closing)                        return 0;                    while (isspace(cp[i-1]))                        if (--i <= 0)                            return 0;                    inbufptr = after;                    cp2 = ALLOC(i + 1, char, strings);                    strncpy(cp2, cp, i);                    cp2[i] = 0;                    if (handle_include(cp2))			return 2;		    break;		case 's':		case 'S':		    cp = inbufptr + 3;		    outsection(minorspace);		    if (cp == closing) {			output("#undef __SEG__\n");		    } else {			output("#define __SEG__ ");			while (*cp && cp != closing)			    cp++;			if (*cp) {			    i = *cp;			    *cp = 0;			    output(inbufptr + 3);			    *cp = i;			}			output("\n");		    }		    outsection(minorspace);		    inbufptr = after;		    return 1;            }            return 0;	case '}':	case '*':	    if (inbufptr + 2 == closing) {		switch (inbufptr[1]) {		    		  case 's':		  case 'S':		    outsection(minorspace);		    output("#undef __SEG__\n");		    outsection(minorspace);		    inbufptr = after;		    return 1;		}	    }	    return 0;        case 'f':   /* $ifdef etc. */        case 'F':            if (toupper(inbufptr[1]) == 'I' &&                ((toupper(inbufptr[3]) == 'O' &&                  toupper(inbufptr[4]) == 'P' &&                  toupper(inbufptr[5]) == 'T') ||                 (toupper(inbufptr[3]) == 'D' &&                  toupper(inbufptr[4]) == 'E' &&                  toupper(inbufptr[5]) == 'F') ||                 (toupper(inbufptr[3]) == 'N' &&                  toupper(inbufptr[4]) == 'D' &&                  toupper(inbufptr[5]) == 'E' &&                  toupper(inbufptr[6]) == 'F'))) {                note("Turbo Pascal conditional compilation directive was ignored [218]");            }            return 0;    }    return 0;}extern Strlist *addmacros;void defmacro(name, kind, fname, lnum)char *name, *fname;long kind;int lnum;{    Strlist *defsl, *sl, *sl2;    Symbol *sym, *sym2;    Meaning *mp;    Expr *ex;    defsl = NULL;    sl = strlist_append(&defsl, name);    C_lex++;    if (fname && !strcmp(fname, "<macro>") && curtok == TOK_IDENT)        fname = curtoksym->name;    push_input_strlist(defsl, fname);    if (fname)        inf_lnum = lnum;    switch (kind) {        case MAC_VAR:            if (!wexpecttok(TOK_IDENT))		break;	    for (mp = curtoksym->mbase; mp; mp = mp->snext) {		if (mp->kind == MK_VAR)		    warning(format_s("VarMacro must be defined before declaration of variable %s [231]", curtokcase));	    }            sl = strlist_append(&varmacros, curtoksym->name);            gettok();            if (!wneedtok(TOK_EQ))		break;            sl->value = (long)pc_expr();            break;        case MAC_CONST:            if (!wexpecttok(TOK_IDENT))		break;	    for (mp = curtoksym->mbase; mp; mp = mp->snext) {		if (mp->kind == MK_CONST)		    warning(format_s("ConstMacro must be defined before declaration of variable %s [232]", curtokcase));	    }            sl = strlist_append(&constmacros, curtoksym->name);            gettok();            if (!wneedtok(TOK_EQ))		break;            sl->value = (long)pc_expr();            break;        case MAC_FIELD:            if (!wexpecttok(TOK_IDENT))		break;            sym = curtoksym;            gettok();            if (!wneedtok(TOK_DOT))		break;            if (!wexpecttok(TOK_IDENT))		break;	    sym2 = curtoksym;            gettok();	    if (!wneedtok(TOK_EQ))		break;            funcmacroargs = NULL;            sym->flags |= FMACREC;            ex = pc_expr();            sym->flags &= ~FMACREC;	    for (mp = sym2->fbase; mp; mp = mp->snext) {

⌨️ 快捷键说明

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