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

📄 new7-6.c

📁 用C开发的C语言编译器
💻 C
📖 第 1 页 / 共 3 页
字号:
                                p=insert("*=",operater);
                                else
                                {p=insert("*",TIMES);
                                 ungetc(t,fp);
                                 }
                             }
                            break;
                            case '/':
                             { t=fgetc(fp);
                               if(t=='*')                /*判断注释*/
                               {
                                    while(1){
                                            t=fgetc(fp);
                                            if(feof(fp))
                                            {
                                                printf("/*error!*/");
                                                fprintf(outp,"/*error!*/");
                                                getch();
                                                exit(0);
                                            }
                                            else if(t=='*')
                                            {
                                                 t=fgetc(fp);
                                                if(feof(fp))
                                                 {
                                                printf("/*error!*/");
                                                fprintf(outp,"/*error!*/");
                                                getch();
                                                exit(0);
                                                    }
                                             else if(t=='/')
                                                return lexan();
                                            }
                                            }
                                }
                                else if(t=='=')
                                p=insert("/=",operater);
                                else
                                {ungetc(t,fp);
                                p=insert("/",OVER);}
                            }
                            break;
                            case '=':
                              {
                                t=fgetc(fp);
                                if(t=='=')
                                p=insert("==",EQA);
                                else
                                {p=insert("=",EQ);
                                 ungetc(t,fp);
                                 }
                             }
                            break;
                            case '>':
                             { t=fgetc(fp);
                               if(t=='=')
                               p=insert(">=",RE);
                               else
                               {
                                    p=insert(">",RT);
                                    ungetc(t,fp);
                               }
                             }
                            break;
                            case '<':
                             { t=fgetc(fp);
                               if(t=='=')
                               p=insert("<=",LE);
                               else if(t=='>')
                               p=insert("<>",operater);
                               else
                               {
                                    p=insert("<",LT);
                                    ungetc(t,fp);
                               }
                             }
                            break;
                            case '%':
                             p=insert("%",sign);
                            break;
                            case '!':
                              {
                                t=fgetc(fp);
                                if(t=='=')
                                p=insert("!=",NOTEQUEL);
                                else
                                {p=insert("!",sign);
                                 ungetc(t,fp);
                                 }
                             }
                            break;
                            case '~':
                             p=insert("~",sign);
                            break;
                            case '^':
                             p=insert("^",sign);
                            break;
                            case '.':
                            p=insert(".",sign);
                            break;
                            case '?':
                            p=insert("?",sign);
                            break;
                            case ':':
                              {
                                t=fgetc(fp);
                                if(t=='=')
                                p=insert(":=",operater);
                                else
                                {p=insert(":",operater);
                                 ungetc(t,fp);
                                 }
                             }
                            break;
                            case ',':
                             p=insert(",",COMMA);
                            break;
                            case ';':
                             p=insert(";",SEMI);
                            break;
                            case '\"':
                             p=insert("\"",sign);
                            break;
                            case '\'':
                             p=insert("\'",sign);
                            break;
                            case '{':
                             p=insert("{",LH);
                            break;
                            case '}':
                             p=insert("}",RH);
                            break;
                            case '[':
                             p=insert("[",LBcircle);
                            break;
                            case ']':
                             p=insert("]",RBcircle);
                            break;
                            case '(':
                             p=insert("(",Lcircle);
                            break;
                            case ')':
                             p=insert(")",Rcircle);
                            break;
                            case '#':
                             p=insert("#",sign);
                            break;
                            case '@':
                             p=insert("@",sign);
                            break;
                            case '$':
                             p=insert("$",sign);
                            break;
                            case '&':
                              {
                                t=fgetc(fp);
                                if(t=='&')
                                p=insert("&&",sign);
                                else
                                {p=insert("&",sign);
                                 ungetc(t,fp);
                                 }
                             }
                            break;
                            case '_':
                             p=insert("_",sign);
                            break;
                            case '|':
                              {
                                t=fgetc(fp);
                                if(t=='|')
                                p=insert("||",sign);
                                else
                                {p=insert("|",sign);
                                 ungetc(t,fp);
                                 }
                             }
                            break;
                            case '\\':
                             p=insert("\\",sign);
                            break;
                            default:
                            {printf("Error string!");
                            fprintf(outp,"Error string!");
                            fprintf(errorp,"Error string!");}
                            }
                            tokenval=p;
                            return symtable[p].token;
                     }
           else
                {
                    tokenval=NONE;
                    return t;
                }
}


/********************************************************/
/*                   编译原理实验                       */
/*                   作者:软件四班王磊                 */
/*                   学号:1023710411                   */
/*                   实现功能语法分析                   */
/*                   插入语义动作实现语法制导翻译       */
/*********************************************************/
/***************************语法分析函数***************************************/
prase()                                        /*--语法分析--*/
{
    lookahead=lexan();
    while(lookahead!=DONE)
        {
            fprintf(exp,"Program begin \n");
            declaration_list();
        }
    printf("Translate and edit over, see files for detail!\n ");
    fprintf(exp,"\nTranslate and edit over, see files for detail!\n ");
    fprintf(yuyip,"Function end\n");
}


declaration_list()                             /*--函数声明部分--*/
{
    fprintf(exp,"Declaration part \n");
    declaration();
    while(lookahead!=DONE)
        {
            fprintf(exp,"\nDeclaration part \n");
            declaration();
        }
    return;
}

declaration()
{
   char *m,*n;
   y: if(lookahead==17||lookahead==30)
    {
        if(lookahead==17)
            {fprintf(exp,"type_specifier ");/*emit(17,NONE);*/match(17);strcpy(m,"int");}
        else
            {fprintf(exp,"type_specifier ");/*emit(30,NONE);*/match(30);strcpy(m,"void");}
            strcpy(stringi,m);
            if(lookahead==ID)
                {
                   /* emit(ID, tokenval);  */
                    strcpy(n,symtable[tokenval].lexptr);
                    match(ID);
                        if(lookahead==Lcircle)     /*--声明函数体如main()--*/
                            {
                            fprintf(yuyip,"Fun_declaration\n");
                            fprintf(yuyip,"    Function: %s\n",n);
                            fprintf(yuyip,"    Return type: %s\n",m);
                            fprintf(exp,"\nFunction declaration \n");
                            fun_declaration();}
                        else if(lookahead==SEMI||lookahead==LBcircle||lookahead==COMMA)
                            {
                             if(lookahead==SEMI)
                             fprintf(yuyip,"%s %s\n",m,n);
                             if(lookahead==LBcircle)
                             fprintf(yuyip,"%s %s",m,n);
                             if(lookahead==COMMA)
                             fprintf(yuyip,"%s %s\n",m,n);
                             fprintf(exp,"\nVariable declaration \n");
                             fprintf(exp,"%s %s",m,n);
                             ainsert(m,17);  ainsert(n,ID);
                             var_declaration();}        /*--如声明int a--*/
                        else {error("Var_declaration miss match ;\n");goto y;}
                            /*--识别少;的情况(错误处理)--*/
                }
    }
     return;
}


var_declaration()
{
    char *n,*q;
    if(lookahead==LBcircle)
    {
     emit(LBcircle,NONE);ainsert("[",LBcircle);match(LBcircle);
     emit(NUM,tokenval);strcpy(n,symtable[tokenval].lexptr);ainsert(n,NUM);match(NUM);
     emit(RBcircle,NONE);ainsert("]",RBcircle);match(RBcircle);
     fprintf(yuyip,"[ %s ]\n",n);
     }
    while(lookahead==COMMA)
    {
    emit(COMMA,NONE);
    match(COMMA);
    emit(ID, tokenval);
    strcpy(q,symtable[tokenval].lexptr);
    ainsert(q,ID);
    match(ID);
    fprintf(yuyip,"%s %s\n",stringi,q);
    }
    emit(SEMI,NONE);
    match(SEMI);  fprintf(exp,"\n");
    if(lookahead==17||lookahead==30)
    declaration();
    return;
}


fun_declaration()
{
    emit(Lcircle,NONE);match(Lcircle);
    if(lookahead!=Rcircle)
    params();                               /*--函数参数声明--*/
    if(lookahead!=Rcircle)
        {error("Fun_declaration miss match )\n"); goto z;}
    emit(Rcircle,NONE);match(Rcircle);
   z: compound_stmt();
    return;
}


params()
{
    char *m,*n;
    if(lookahead==17||lookahead==30)
    {
        if(lookahead==17)
            {fprintf(exp,"\ninter type_specifier \n");emit(17,NONE);match(17);strcpy(m,"int");}
        else
            {fprintf(exp,"\ninter type_specifier \n");emit(30,NONE);match(30);strcpy(m,"void");}
    }
        if(lookahead==ID)
                {
                    emit(ID, tokenval);
                    strcpy(n,symtable[tokenval].lexptr);
                    match(ID);
                    fprintf(yuyip,"Inter type_specifier \n");
                    fprintf(yuyip,"%s %s",m,n);
                        if(lookahead==LBcircle)
                            {emit(LBcircle,NONE);match(LBcircle);
                             emit(RBcircle,NONE);match(RBcircle);
                             fprintf(yuyip,"[]\n",m,n);}
                        if(lookahead==COMMA)
                            {emit(COMMA,NONE);match(COMMA);params();}
                    fprintf(yuyip,"\n");
                }
    return;
}


compound_stmt()                                 /*--函数体识别部分--*/
{
    fprintf(yuyip,"Function begin\n");
    fprintf(exp,"\nCompound_statement\n");
    emit(LH,NONE);match(LH);
    local_declarations();
    statement_list();
    if(lookahead!=RH)
    {error("Compound_stmd miss match }\n"); goto y;}   /*--识别复合语句少}--*/
    emit(RH,NONE);match(RH);
   y: return;
}


local_declarations()                            /*--函数体声明--*/
{
    if(lookahead==17||lookahead==30)
    {   fprintf(exp,"\nLocal_declarations \n");
        declaration();
    }
    return;
}


statement_list()                                /*--函数体语句--*/
{
    if(lookahead!=RH&&lookahead!=DONE)
    {   fprintf(exp,"\nStatement \n");
        statement();
        while(lookahead!=RH&&lookahead!=DONE)
            {fprintf(exp,"\nStatement \n");
            statement();}
    }
    return;
}


statement()                                     /*--四种语句的识别--*/
{
    switch(lookahead)
    {                                            /*--if--*/
        case 16:

⌨️ 快捷键说明

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