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

📄 lex.c

📁 把pascal程序转成C语言程序 把pascal程序转成C语言程序
💻 C
📖 第 1 页 / 共 5 页
字号:
		if (mp->rectype && mp->rectype->meaning &&		    mp->rectype->meaning->sym == sym)		    break;	    }	    if (mp) {		mp->constdefn = ex;	    } else {		sl = strlist_append(&fieldmacros, 				    format_ss("%s.%s", sym->name, sym2->name));		sl->value = (long)ex;	    }            break;        case MAC_FUNC:            if (!wexpecttok(TOK_IDENT))		break;            sym = curtoksym;            gettok();            funcmacroargs = NULL;            if (curtok == TOK_LPAR) {                do {                    gettok();		    if (curtok == TOK_RPAR && !funcmacroargs)			break;                    if (!wexpecttok(TOK_IDENT)) {			skiptotoken2(TOK_COMMA, TOK_RPAR);			continue;		    }                    sl2 = strlist_append(&funcmacroargs, curtoksym->name);                    sl2->value = (long)curtoksym;                    curtoksym->flags |= FMACREC;                    gettok();                } while (curtok == TOK_COMMA);                if (!wneedtok(TOK_RPAR))		    skippasttotoken(TOK_RPAR, TOK_EQ);            }            if (!wneedtok(TOK_EQ))		break;	    ex = pc_expr();	    for (;;) {		if (sym->mbase &&		    (sym->mbase->kind == MK_FUNCTION ||		     sym->mbase->kind == MK_SPECIAL)) {		    sym->mbase->constdefn = ex;		} else {		    sl = strlist_append(&funcmacros, sym->name);		    sl->value = (long)ex;		}		if (!strcmp(sym->name, "NEW") || !strcmp(sym->name, "DEC") ||		    !strcmp(sym->name, "STR") || !strcmp(sym->name, "VAL") ||		    !strcmp(sym->name, "BLOCKREAD") ||		    !strcmp(sym->name, "BLOCKWRITE"))		    sym = findsymbol(format_s("%s_TURBO", sym->name));		else		    break;	    }            for (sl2 = funcmacroargs; sl2; sl2 = sl2->next) {                sym2 = (Symbol *)sl2->value;                sym2->flags &= ~FMACREC;            }            strlist_empty(&funcmacroargs);            break;    }    if (curtok != TOK_EOF)        warning(format_s("Junk (%s) at end of macro definition [233]", tok_name(curtok)));    pop_input();    C_lex--;    strlist_empty(&defsl);}void check_unused_macros(){    Strlist *sl;    if (warnmacros) {        for (sl = varmacros; sl; sl = sl->next)            warning(format_s("VarMacro %s was never used [234]", sl->s));        for (sl = constmacros; sl; sl = sl->next)            warning(format_s("ConstMacro %s was never used [234]", sl->s));        for (sl = fieldmacros; sl; sl = sl->next)            warning(format_s("FieldMacro %s was never used [234]", sl->s));        for (sl = funcmacros; sl; sl = sl->next)            warning(format_s("FuncMacro %s was never used [234]", sl->s));    }}#define skipspc(cp)   while (isspace(*cp)) cp++Static int parsecomment(p2c_only, starparen)int p2c_only, starparen;{    char namebuf[302];    char *cp, *cp2 = namebuf, *closing, *after;    char kind, chgmode, upcflag;    long val, oldval, sign;    double dval;    int i, tempopt, hassign;    Strlist *sp;    Symbol *sym;    if (if_flag)        return 0;    if (!p2c_only) {        if (!strncmp(inbufptr, noskipcomment, strlen(noskipcomment)) &&	     *noskipcomment) {            inbufptr += strlen(noskipcomment);	    if (skipflag < 0) {		if (skipflag < -1) {		    skipflag++;		} else {		    curtok = TOK_ENDIF;		    skipflag = 1;		    return 2;		}	    } else {		skipflag = 1;		return 1;	    }        }    }    closing = inbufptr;    while (*closing && (starparen			? (closing[0] != '*' || closing[1] != ')')			: (closing[0] != '}')))	closing++;    if (!*closing)	return 0;    after = closing + (starparen ? 2 : 1);    cp = inbufptr;    while (cp < closing && (*cp != '#' || cp[1] != '#'))	cp++;    /* Ignore comments */    if (cp < closing) {	while (isspace(cp[-1]))	    cp--;	*cp = '#';   /* avoid skipping spaces past closing! */	closing = cp;    }    if (!p2c_only) {        if (!strncmp(inbufptr, "DUMP-SYMBOLS", 12) &&	     closing == inbufptr + 12) {            wrapup();            inbufptr = after;            return 1;        }        if (!strncmp(inbufptr, fixedcomment, strlen(fixedcomment)) &&	     *fixedcomment &&	     inbufptr + strlen(fixedcomment) == closing) {            fixedflag++;            inbufptr = after;            return 1;        }        if (!strncmp(inbufptr, permanentcomment, strlen(permanentcomment)) &&	     *permanentcomment &&	     inbufptr + strlen(permanentcomment) == closing) {            permflag = 1;            inbufptr = after;            return 1;        }        if (!strncmp(inbufptr, interfacecomment, strlen(interfacecomment)) &&	     *interfacecomment &&	     inbufptr + strlen(interfacecomment) == closing) {            inbufptr = after;	    curtok = TOK_INTFONLY;            return 2;        }        if (!strncmp(inbufptr, skipcomment, strlen(skipcomment)) &&	     *skipcomment &&	     inbufptr + strlen(skipcomment) == closing) {            inbufptr = after;	    skipflag--;	    if (skipflag == -1) {		skipping_module++;    /* eat comments in skipped portion */		do {		    gettok();		} while (curtok != TOK_ENDIF);		skipping_module--;	    }            return 1;        }	if (!strncmp(inbufptr, signedcomment, strlen(signedcomment)) &&	     *signedcomment && !p2c_only &&	     inbufptr + strlen(signedcomment) == closing) {	    inbufptr = after;	    gettok();	    if (curtok == TOK_IDENT && curtokmeaning &&		curtokmeaning->kind == MK_TYPE &&		curtokmeaning->type == tp_char) {		curtokmeaning = mp_schar;	    } else		warning("{SIGNED} applied to type other than CHAR [314]");	    return 2;	}	if (!strncmp(inbufptr, unsignedcomment, strlen(unsignedcomment)) &&	     *unsignedcomment && !p2c_only &&	     inbufptr + strlen(unsignedcomment) == closing) {	    inbufptr = after;	    gettok();	    if (curtok == TOK_IDENT && curtokmeaning &&		curtokmeaning->kind == MK_TYPE &&		curtokmeaning->type == tp_char) {		curtokmeaning = mp_uchar;	    } else if (curtok == TOK_IDENT && curtokmeaning &&		       curtokmeaning->kind == MK_TYPE &&		       curtokmeaning->type == tp_integer) {		curtokmeaning = mp_unsigned;	    } else if (curtok == TOK_IDENT && curtokmeaning &&		       curtokmeaning->kind == MK_TYPE &&		       curtokmeaning->type == tp_int) {		curtokmeaning = mp_uint;	    } else		warning("{UNSIGNED} applied to type other than CHAR or INTEGER [313]");	    return 2;	}	if (!strncmp(inbufptr, tagcomment, strlen(tagcomment)) &&	     *tagcomment &&	     inbufptr + strlen(tagcomment) == closing) {	    taggedflag++;	    inbufptr = after;	    return 1;	}        if (*inbufptr == '$') {            i = turbo_directive(closing, after);            if (i)                return i;        }    }    tempopt = 0;    cp = inbufptr;    if (*cp == '*') {        cp++;        tempopt = 1;    }    if (!isalpha(*cp))        return 0;    while ((isalnum(*cp) || *cp == '_') && cp2 < namebuf+300)        *cp2++ = toupper(*cp++);    if (cp[0] == '+' && cp[1] == '+' &&	cp == inbufptr+1 && toupper(cp[-1]) == 'C')	*cp2++ = *cp++, *cp2++ = *cp++;    *cp2 = 0;    i = numparams;    while (--i >= 0 && strcmp(rctable[i].name, namebuf)) ;    if (i < 0)        return 0;    kind = rctable[i].kind;    chgmode = rctable[i].chgmode;    if (chgmode == ' ')    /* allowed in p2crc only */        return 0;    if (chgmode == 'T' && lex_initialized) {        if (cp == closing || *cp == '=' || *cp == '+' || *cp == '-')            warning(format_s("%s works only at top of program [235]",                             rctable[i].name));    }    if (cp == closing) {        if (kind == 'S' || kind == 'I' || kind == 'D' || kind == 'L' ||	    kind == 'R' || kind == 'B' || kind == 'C' || kind == 'U') {            undooption(i, "");            inbufptr = after;            return 1;        }    }    switch (kind) {        case 'S':        case 'I':        case 'L':            val = oldval = (kind == 'L') ? *(( long *)rctable[i].ptr) :                           (kind == 'S') ? *((short *)rctable[i].ptr) :                                           *((  int *)rctable[i].ptr);            switch (*cp) {                case '=':                    skipspc(cp);		    hassign = (*++cp == '-' || *cp == '+');                    sign = (*cp == '-') ? -1 : 1;		    cp += hassign;                    if (isdigit(*cp)) {                        val = 0;                        while (isdigit(*cp))                            val = val * 10 + (*cp++) - '0';                        val *= sign;			if (kind == 'D' && !hassign)			    val += 10000;                    } else if (toupper(cp[0]) == 'D' &&                               toupper(cp[1]) == 'E' &&                               toupper(cp[2]) == 'F') {                        val = rctable[i].def;                        cp += 3;                    }                    break;                case '+':                case '-':                    if (chgmode != 'R')                        return 0;                    for (;;) {                        if (*cp == '+')                            val++;                        else if (*cp == '-')                            val--;                        else                            break;                        cp++;                    }                    break;            }            skipspc(cp);            if (cp != closing)                return 0;            strlist_insert(&rcprevvalues[i], "")->value = oldval;            if (tempopt)                strlist_insert(&tempoptionlist, "")->value = i;            if (kind == 'L')                *((long *)rctable[i].ptr) = val;            else if (kind == 'S')                *((short *)rctable[i].ptr) = val;            else                *((int *)rctable[i].ptr) = val;            inbufptr = after;            return 1;	case 'D':            val = oldval = *((int *)rctable[i].ptr);	    if (*cp++ != '=')		return 0;	    skipspc(cp);	    if (toupper(cp[0]) == 'D' &&		toupper(cp[1]) == 'E' &&		toupper(cp[2]) == 'F') {		val = rctable[i].def;		cp += 3;	    } else {                cp2 = namebuf;                while (*cp && cp != closing && !isspace(*cp))                    *cp2++ = *cp++;		*cp2 = 0;		val = parsedelta(namebuf, -1);		if (!val)		    return 0;	    }	    skipspc(cp);            if (cp != closing)                return 0;            strlist_insert(&rcprevvalues[i], "")->value = oldval;            if (tempopt)                strlist_insert(&tempoptionlist, "")->value = i;            *((int *)rctable[i].ptr) = val;            inbufptr = after;            return 1;        case 'R':	    if (*cp++ != '=')		return 0;	    skipspc(cp);	    if (toupper(cp[0]) == 'D' &&		toupper(cp[1]) == 'E' &&		toupper(cp[2]) == 'F') {		dval = rctable[i].def / 100.0;		cp += 3;	    } else {		cp2 = cp;		while (isdigit(*cp) || *cp == '-' || *cp == '+' ||		       *cp == '.' || toupper(*cp) == 'E')		    cp++;		if (cp == cp2)		    return 0;		dval = atof(cp2);	    }	    skipspc(cp);	    if (cp != closing)		return 0;	    sprintf(namebuf, "%g", *((double *)rctable[i].ptr));            strlist_insert(&rcprevvalues[i], namebuf);            if (tempopt)                strlist_insert(&tempoptionlist, namebuf)->value = i;	    *((double *)rctable[i].ptr) = dval;            inbufptr = after;            return 1;        case 'B':	    if (*cp++ != '=')		return 0;	    skipspc(cp);	    if (toupper(cp[0]) == 'D' &&		toupper(cp[1]) == 'E' &&		toupper(cp[2]) == 'F') {		val = rctable[i].def;		cp += 3;	    } else {		val = parse_breakstr(cp);		while (*cp && cp != closing && !isspace(*cp))		    cp++;	    }	    skipspc(cp);	    if (cp != closing || val == -1)		return 0;            strlist_insert(&rcprevvalues[i], "")->value =		*((short *)rctable[i].ptr);            if (tempopt)                strlist_insert(&tempoptionlist, "")->value = i;	    *((short *)rctable[i].ptr) = val;            inbufptr = after;            return 1;        case 'C':        case 'U':            if (*cp == '=') {                cp++;                skipspc(cp);                for (cp2 = cp; cp2 != closing && !isspace(*cp2); cp2++)                    if (!*cp2 || cp2-cp >= rctable[i].def)                        return 0;                cp2 = (char *)rctable[i].ptr;                sp = strlist_insert(&rcprevvalues[i], cp2);                if (tempopt)                    strlist_insert(&tempoptionlist, "")->value = i;                while (cp != closing && !isspace(*cp2))                    *cp2++ = *cp++;                *cp2 = 0;                if (kind == 'U')                    upc((char *)rctable[i].ptr);                skipspc(cp);                if (cp != closing)                    return 0;                inbufptr = after;                if (!strcmp(rctable[i].name, "LANGUAGE") &&                    !strcmp((char *)rctable[i].ptr, "MODCAL"))                    sysprog_flag |= 2;                return 1;            }            return 0;        case 'F':        case 'G':            if (*cp == '=' || *cp == '+' || *cp == '-') {                upcflag = (kind == 'F' && !pascalcasesens);                chgmode = *cp++;                skipspc(cp);                cp2 = namebuf;                while (isalnum(*cp) || *cp == '_' || *cp == '$' || *cp == '%')                    *cp2++ = *cp++;                *cp2++ = 0;		if (!*namebuf)		    return 0;                skipspc(cp);                if (cp != closing)                    return 0;                if (upcflag)                    upc(namebuf);                sym = findsymbol(namebuf);		if (rctable[i].def & FUNCBREAK)		    sym->flags &= ~FUNCBREAK;                if (chgmode == '-')                    sym->flags &= ~rctable[i].def;                else                    sym->flags |= rctable[i].def;                inbufptr = after;                return 1;           }           return 0;        case 'A':            if (*cp == '=' || *cp == '+' || *cp == '-') {                chgmode = *cp++;                skipspc(cp);                cp2 = namebuf;                while (cp != closing && !isspace(*cp) && *cp)                    *cp2++ = *cp++;                *cp2++ = 0;                skipspc(cp);                if (cp != closing)                    return 0;                if (chgmode != '+')                    strlist_remove((Strlist **)rctable[i].ptr, namebuf);                if (chgmode != '-')                    sp = strlist_insert((Strlist **)rctable[i].ptr, namebuf);                if (tempopt)                    strlist_insert(&tempoptionlist, namebuf)->value = i;                inbufptr = after;                return 1;            }            return 0;        case 'M':            if (!isspace(*cp))                return 0;            skipspc(cp);            if (!isalpha(*cp))                return 0;            for (cp2 = cp; *cp2 && cp2 != closing; cp2++) ;            if (cp2 > cp && cp2 == closing) {                inbufptr = after;                cp2 = format_ds("%.*s", (int)(cp2-cp), cp);                if (tp_integer != NULL) {                    defmacro(cp2, rctable[i].def, NULL, 0);                } else {                    sp = strlist_append(&addmacros, cp2);                    sp->value = rctable[i].def;                }                return 1;            }            return 0;        case 'X':            switch (rctable[i].def) {                case 1:     /* strlist with string values */                case 4:     /* strlist with string values */                    if (!isspace(*cp) && *cp != '=' &&                         *cp != '+' && *cp != '-')                        return 0;                    chgmode = *cp++;                    skipspc(cp);                    cp2 = namebuf;		    if (*cp == '"' && rctable[i].def == 4) {			cp++;			while (*cp != '"') {			    if (cp == closing)				return 0;			    if (*cp == 92 && cp+1 < closing)				cp++;			    *cp2++ = *cp++;			}			cp++;		    } else {			while (isalnum(*cp) || *cp == '_' ||			       *cp == '$' || *cp == '%' ||			       *cp == '.' || *cp == '-' ||			       (*cp == '\'' && cp[1] && cp[2] == '\'' &&				cp+1 != closing && cp[1] != '=')) {			    if (*cp == '\'') {				*cp2++ = *cp++;				*cp2++ = *cp++;			    }			    			    *cp2++ = *cp++;			}

⌨️ 快捷键说明

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