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

📄 nepc.c

📁 使用yacc和lex编写的cmm语言的词法分析和语法分析程序.
💻 C
📖 第 1 页 / 共 3 页
字号:
                else if(pret1->type==typeFlt && pret2->type==typeInt)                {                    pret1->fval += pret2->ival;                    free(pret2);                    return pret1;                }                else if(pret1->type==typeStr && pret2->type==typeStr)                {                    int m=strlen(pret1->pstr);                    int n=strlen(pret2->pstr);                    char *s= malloc(m+n+1);                    strncpy(s,pret1->pstr,m);                    strncat(s,pret2->pstr,n);                    s[m+n]='\0';                    free(pret1->pstr);                    free(pret2->pstr);                    pret1->pstr=s;                    return pret1;                }                else                {                    free(pret1);                    free(pret2);                    pret->ival=0;                    return pret;                }                break;            case '-':                 pret1=interpret(p->opr.op[0]);                pret2=interpret(p->opr.op[1]);                if( NULL==pret1 || NULL==pret2)                {                    free(pret1);                    free(pret2);                    return NULL;                }                if(pret1->type==typeInt && pret2->type==typeInt)                {                    pret1->ival -= pret2->ival;                    free(pret2);                    return pret1;                }                else if(pret1->type==typeFlt && pret2->type==typeFlt)                {                    pret1->fval -= pret2->fval;                    free(pret2);                    return pret1;                }                else if(pret1->type==typeInt && pret2->type==typeFlt)                {                    pret2->fval = pret1->ival - pret2->fval;                    free(pret1);                    return pret2;                }                else if(pret1->type==typeFlt && pret2->type==typeInt)                {                    pret1->fval -= pret2->ival;                    free(pret2);                    return pret1;                }                else                {                    free(pret1);                    free(pret2);                    pret->ival=0;                    return pret;                }                break;            case '*':                 pret1=interpret(p->opr.op[0]);                pret2=interpret(p->opr.op[1]);                if( NULL==pret1 || NULL==pret2)                {                    free(pret1);                    free(pret2);                    return NULL;                }                if(pret1->type==typeInt && pret2->type==typeInt)                {                    pret1->ival *= pret2->ival;                    free(pret2);                    return pret1;                }                else if(pret1->type==typeFlt && pret2->type==typeFlt)                {                    pret1->fval *= pret2->fval;                    free(pret2);                    return pret1;                }                else if(pret1->type==typeInt && pret2->type==typeFlt)                {                    pret2->fval *= pret1->ival;                    free(pret1);                    return pret2;                }                else if(pret1->type==typeFlt && pret2->type==typeInt)                {                    pret1->fval *= pret2->ival;                    free(pret2);                    return pret1;                }                else                {                    free(pret1);                    free(pret2);                    pret->ival=0;                    return pret;                }                break;            case '/':                pret1=interpret(p->opr.op[0]);                pret2=interpret(p->opr.op[1]);                if( NULL==pret1 || NULL==pret2)                {                    free(pret1);                    free(pret2);                    return NULL;                }                if(pret1->type==typeInt && pret2->type==typeInt)                {                    if(pret2->ival == 0)                    {                        pret1->fval /= pret2->ival;                        pret1->type = typeFlt;                    }                    else pret1->ival /= pret2->ival;                    free(pret2);                    return pret1;                }                else if(pret1->type==typeFlt && pret2->type==typeFlt)                {                    pret1->fval /= pret2->fval;                    free(pret2);                    return pret1;                }                else if(pret1->type==typeInt && pret2->type==typeFlt)                {                    pret2->fval = pret1->ival / pret2->fval;                    free(pret1);                    return pret2;                }                else if(pret1->type==typeFlt && pret2->type==typeInt)                {                    pret1->fval /= pret2->ival;                    free(pret2);                    return pret1;                }                else                {                    free(pret1);                    free(pret2);                    pret->ival=0;                    return pret;                }                break;            case '<':                pret1=interpret(p->opr.op[0]);                pret2=interpret(p->opr.op[1]);                if( NULL==pret1 || NULL==pret2)                {                    free(pret1);                    free(pret2);                    return NULL;                }                if(pret1->type==typeInt && pret2->type==typeInt)                {                    if(pret1->ival < pret2->ival) pret->ival =1 ;                    else pret->ival=0;                }                else if(pret1->type==typeFlt && pret2->type==typeFlt)                {                   if(pret1->fval < pret2->fval) pret->ival =1 ;                    else pret->ival=0;                }                else if(pret1->type==typeInt && pret2->type==typeFlt)                {                    if(pret1->ival < pret2->fval) pret->ival =1 ;                    else pret->ival=0;                }                else if(pret1->type==typeFlt && pret2->type==typeInt)                {                    if(pret1->fval < pret2->ival) pret->ival =1 ;                    else pret->ival=0;                }                else                {                    pret->ival=0;                }                free(pret1);                free(pret2);                return pret;                break;            case '>':                pret1=interpret(p->opr.op[0]);                pret2=interpret(p->opr.op[1]);                if( NULL==pret1 || NULL==pret2)                {                    free(pret1);                    free(pret2);                    return NULL;                }                if(pret1->type==typeInt && pret2->type==typeInt)                {                    if(pret1->ival > pret2->ival) pret->ival =1 ;                    else pret->ival=0;                }                else if(pret1->type==typeFlt && pret2->type==typeFlt)                {                   if(pret1->fval > pret2->fval) pret->ival =1 ;                    else pret->ival=0;                }                else if(pret1->type==typeInt && pret2->type==typeFlt)                {                    if(pret1->ival > pret2->fval) pret->ival =1 ;                    else pret->ival=0;                }                else if(pret1->type==typeFlt && pret2->type==typeInt)                {                    if(pret1->fval > pret2->ival) pret->ival =1 ;                    else pret->ival=0;                }                else                {                    pret->ival=0;                }                free(pret1);                free(pret2);                return pret;                break;            case '%':                pret1=interpret(p->opr.op[0]);                pret2=interpret(p->opr.op[1]);                if( NULL==pret1 || NULL==pret2)                {                    free(pret1);                    free(pret2);                    return NULL;                }                if(pret1->type==typeInt && pret2->type==typeInt)                {                    pret->ival=pret1->ival % pret2->ival ;                }                else if(pret1->type==typeFlt && pret2->type==typeFlt)                {                    pret->ival= (INT)(pret1->fval) % pret2->ival;                }                else if(pret1->type==typeInt && pret2->type==typeFlt)                {                    pret->ival=pret1->ival % (INT)(pret2->fval) ;                }                else if(pret1->type==typeFlt && pret2->type==typeInt)                {                    pret->ival=(INT)(pret1->ival) % (INT)(pret2->ival) ;                }                else                {                    pret->ival=0;                }                free(pret1);                free(pret2);                return pret;                break;            case AND:                pret1=interpret(p->opr.op[0]);                pret2=interpret(p->opr.op[1]);                if( NULL==pret1 || NULL==pret2)                {                    free(pret1);                    free(pret2);                    return NULL;                }                if(pret1->type==typeInt && pret2->type==typeInt)                {                    pret->ival=pret1->ival && pret2->ival ;                }                else if(pret1->type==typeFlt && pret2->type==typeFlt)                {                    pret->ival= (INT)(pret1->fval) && pret2->ival;                }                else if(pret1->type==typeInt && pret2->type==typeFlt)                {                    pret->ival=pret1->ival && (INT)(pret2->fval) ;                }                else if(pret1->type==typeFlt && pret2->type==typeInt)                {                    pret->ival=(INT)(pret1->ival) && (INT)(pret2->ival) ;                }                else                {                    pret->ival=0;                }                free(pret1);                free(pret2);                return pret;                break;            case OR:                pret1=interpret(p->opr.op[0]);                pret2=interpret(p->opr.op[1]);                if( NULL==pret1 || NULL==pret2)                {                    free(pret1);                    free(pret2);                    return NULL;                }                if(pret1->type==typeInt && pret2->type==typeInt)                {                    pret->ival=pret1->ival || pret2->ival ;                }                else if(pret1->type==typeFlt && pret2->type==typeFlt)                {                    pret->ival= (INT)(pret1->fval) || pret2->ival;                }                else if(pret1->type==typeInt && pret2->type==typeFlt)                {                    pret->ival=pret1->ival || (INT)(pret2->fval) ;                }                else if(pret1->type==typeFlt && pret2->type==typeInt)                {                    pret->ival=(INT)(pret1->ival) || (INT)(pret2->ival) ;                }                else                {                    pret->ival=0;                }                free(pret1);                free(pret2);                return pret;                break;            case GE:                pret1=interpret(p->opr.op[0]);                pret2=interpret(p->opr.op[1]);                if( NULL==pret1 || NULL==pret2)                {                    free(pret1);                    free(pret2);                    return NULL;                }                if(pret1->type==typeInt && pret2->type==typeInt)                {                    if(pret1->ival >= pret2->ival) pret->ival =1 ;                    else pret->ival=0;                }                else if(pret1->type==typeFlt && pret2->type==typeFlt)                {                   if(pret1->fval >= pret2->fval) pret->ival =1 ;                    else pret->ival=0;                }                else if(pret1->type==typeInt && pret2->type==typeFlt)                {                    if(pret1->ival >= pret2->fval) pret->ival =1 ;                    else pret->ival=0;

⌨️ 快捷键说明

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