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

📄 main.c

📁 该程序是用c实现的词法语法分析器,使用方式参见程序说明.
💻 C
📖 第 1 页 / 共 3 页
字号:
                   {
                           printf("%s ",expression13[j]);
                           fprintf(out,"%s ",expression13[j]);
                   }
                   printf("\n");
                   fprintf(out,"\n");
                   break;
              case 14:
                   for(j = 9;j > 1;j--)
                   {
                          push(expression14[j],&st) ;                          
                   }
                   for(j =0;j < 10;j++)
                   {
                           printf("%s ",expression14[j]);
                           fprintf(out,"%s ",expression14[j]);
                   }
                   printf("\n");
                   fprintf(out,"\n");
                   break;
              case 15:
                   for(j = 5;j > 1;j--)
                   {
                          push(expression15[j],&st) ;                          
                   }
                   for(j =0;j < 6;j++)
                   {
                           printf("%s ",expression15[j]);
                           fprintf(out,"%s ",expression15[j]);
                   }
                   printf("\n");
                   fprintf(out,"\n");
                   break;
              case 16:
                   /*for(j = 2;j > 1;j--)
                   {
                          push(expression16[j],&st) ;                          
                   }*/
                   for(j =0;j < 3;j++)
                   {
                           printf("%s ",expression16[j]);
                           fprintf(out,"%s ",expression16[j]);
                   }
                   printf("\n");
                   fprintf(out,"\n");
                   break;
              case 17:
                   for(j = 3;j > 1;j--)
                   {
                          push(expression17[j],&st) ;                          
                   }
                   for(j =0;j < 4;j++)
                   {
                           printf("%s ",expression17[j]);
                           fprintf(out,"%s ",expression17[j]);
                   }
                   printf("\n");
                   fprintf(out,"\n");
                   break;
              case 18:
                   for(j = 3;j > 1;j--)
                   {
                          push(expression18[j],&st) ;                          
                   }
                   for(j =0;j < 4;j++)
                   {
                           printf("%s ",expression18[j]);
                           fprintf(out,"%s ",expression18[j]);
                   }
                   printf("\n");
                   fprintf(out,"\n");
                   break;
              case 19:
                   /*for(j = 2;j > 1;j--)
                   {
                          push(expression19[j],&st) ;                          
                   }*/
                   for(j =0;j < 3;j++)
                   {
                           printf("%s ",expression19[j]);
                           fprintf(out,"%s ",expression19[j]);
                   }
                   printf("\n");
                   fprintf(out,"\n");
                   break;
              case 20:
                   for(j = 3;j > 1;j--)
                   {
                          push(expression20[j],&st) ;                          
                   }
                   for(j =0;j < 4;j++)
                   {
                           printf("%s ",expression20[j]);
                           fprintf(out,"%s ",expression20[j]);
                   }
                   printf("\n");
                   fprintf(out,"\n");
                   break;
              case 21:
                   for(j = 4;j > 1;j--)
                   {
                          push(expression21[j],&st) ;                          
                   }
                   for(j =0;j < 5;j++)
                   {
                           printf("%s ",expression21[j]);
                           fprintf(out,"%s ",expression21[j]);
                   }
                   printf("\n");
                   fprintf(out,"\n");
                   break;
              case 22:
                   /*for(j = 2;j > 1;j--)
                   {
                          push(expression22[j],&st) ;                          
                   }*/
                   for(j =0;j < 3;j++)
                   {
                           printf("%s ",expression22[j]);
                           fprintf(out,"%s ",expression22[j]);
                   }
                   printf("\n");
                   fprintf(out,"\n");
                   break;
              case 23:
                   for(j = 3;j > 1;j--)
                   {
                          push(expression23[j],&st) ;                          
                   }
                   for(j =0;j < 4;j++)
                   {
                           printf("%s ",expression23[j]);
                           fprintf(out,"%s ",expression23[j]);
                   }
                   printf("\n");
                   fprintf(out,"\n");
                   break;
              case 24:
                   for(j = 4;j > 1;j--)
                   {
                          push(expression24[j],&st) ;                          
                   }
                   for(j =0;j < 5;j++)
                   {
                           printf("%s ",expression24[j]);
                           fprintf(out,"%s ",expression24[j]);
                   }
                   printf("\n");
                   fprintf(out,"\n");
                   break;
              case 25:
                   /*for(j = 2;j > 1;j--)
                   {
                          push(expression25[j],&st) ;                          
                   }*/
                   for(j =0;j < 3;j++)
                   {
                           printf("%s ",expression25[j]);
                           fprintf(out,"%s ",expression25[j]);
                   }
                   printf("\n");
                   fprintf(out,"\n");
                   break;
              case 26:
                   for(j = 2;j > 1;j--)
                   {
                          push(expression26[j],&st) ;                          
                   }
                   for(j =0;j < 3;j++)
                   {
                           printf("%s ",expression26[j]);
                           fprintf(out,"%s ",expression26[j]);
                   }
                   printf("\n");
                   fprintf(out,"\n");
                   break;
              case 27:
                   for(j = 2;j > 1;j--)
                   {
                          push(expression27[j],&st) ;                          
                   }
                   for(j =0;j < 3;j++)
                   {
                           printf("%s ",expression27[j]);
                           fprintf(out,"%s ",expression27[j]);
                   }
                   printf("\n");
                   fprintf(out,"\n");
                   break;
              case 28:
                   for(j = 4;j > 1;j--)
                   {
                          push(expression28[j],&st) ;                          
                   }
                   for(j =0;j < 5;j++)
                   {
                           printf("%s ",expression28[j]);
                           fprintf(out,"%s ",expression28[j]);
                   }
                   printf("\n");
                   fprintf(out,"\n");
                   break;
              case 29:
                   for(j = 3;j > 1;j--)
                   {
                          push(expression29[j],&st) ;                          
                   }
                   for(j =0;j < 4;j++)
                   {
                           printf("%s ",expression29[j]);
                           fprintf(out,"%s ",expression29[j]);
                   }
                   printf("\n");
                   fprintf(out,"\n");
                   break;
              case 30:
                   for(j = 2;j > 1;j--)
                   {
                          push(expression30[j],&st) ;                          
                   }
                   for(j =0;j < 3;j++)
                   {
                           printf("%s ",expression30[j]);
                           fprintf(out,"%s ",expression30[j]);
                   }
                   printf("\n");
                   fprintf(out,"\n");
                   break;
              default:
                   error("push stack wrong!");
     }          
}

/* create all wrong information */
void error(char *m)
{
    fprintf(stderr,"%s\n",m);
    getch();
    exit(1); /* Not well-balanced exit */
}

// syntax analyze
void parse()
{    
    makeNull(&st);
    push("$",&st);    
    push("Program",&st);    
    
    int m,n,ip = 0;
    char * X,*Y;
    
    do{         
         int tp = top(&st);
         X = st.elements[tp];
         Y = inToken[ip];
         m = indenX(X);         
         n = indenT(Y);
         
         /*
         printf("top = %d\n",tp);
         printf("X == %s \n",X);
         printf("Y == %s \n",Y);
         printf("m == %d \n",m);
         printf("n == %d \n",n);
         printf("indenT(X) == %d \n",indenT(X));
         getch();
         //*/
         
         if(indenT(X))
         {
            if(!strcmp(X,inToken[ip]))
            {                                      
                pop(&st);                
                ip++;                             
            }
            else
            {
                error(" syntax error ");
            }
         }
         else
         {                   
             if(anaTable[m][n] != -1)
             {       
                  printf("%d\n",k++);                        
                  pop(&st);
                  showExp(anaTable[m][n]); 
                                                               
             }
             else
             {
                 error(" syntax error ");
             }
         }                  
    }while(strcmp(X,"$"));             
}





int main()
{
    char c[2];/*用于存放一个读入的字符和一个'\0' ,以方便加入str  */
    int i;
    int num;

    c[1] = '\0';
    for(i=0;i<1000;i++)
    {
          strcpy(inToken[i],"$");
    }
    in = fopen("source.txt", "r");
    if (in==NULL)
    {
        printf("can not open the files source.c\n");
    }
    else
    {
        out = fopen("out.txt", "w");
        if (out==NULL)
        {
            printf("无法创建文件out.txt\n");
        }
        else
        {
            c[0] = fgetc(in);/*先读一个字符 */
            while(!feof(in))
            {
                switch(c[0])
                {
                    /*以下三个字符用于分割标志符*/
                    case ' ':FindKey();break;/*空格*/
                    case '\t':FindKey();break;/*制表符*/
                    case '\n':FindKey();line++;break;/*换行符 标记行数line加1*/
                    
                    case '+':FindKey();
                             hand_addop('+');
                			 break;
                    case '-':FindKey();
                            hand_addop('-');
                            break;
                    case '*':FindKey();
                            hand_mulop('*');
                            break;
                    case '/':FindKey();
                            hand_mulop('/');
                            break;
                    
                    /*可能会出现>=或是<=的情况,需要探察下一个字符*/
                    case '<':FindKey();
                             hand_relop('<');
                             break;
                             
                    case '>':FindKey();
                             hand_relop('>');
                             break;
                             
                    case '=':FindKey();
                             hand_fuhao('=');
                             break;
                    
                    /*读下一位,看看是不是"!=",如果不是,则把'!'加入到待分析的字符串中*/
                    case '!':FindKey();
                             hand_fuhao('!');
                             break;
                    
                    case ';':FindKey();
                            hand_fuhao(';');
                            break;
                    case ',':FindKey();
                            hand_fuhao(',');
                            break;
                    case '(':FindKey();
                            hand_fuhao('(');
                            break;
                    case ')':FindKey();
                            hand_fuhao(')');
                            break;
                    case '{':FindKey();
                            hand_fuhao('{');
                            break;
                    case '}':FindKey();
                            hand_fuhao('}');
                            break;
                    
                    default:strcat(str, c);/*这里可以很方便的将刚读的字符加入到str  */
                                           /*因为strcat只能链接两个字符串!  */
                }
                c[0] = fgetc(in);/*继续读一个字符 */
            }
        }
    }
    printf("\n\n\ntoken table:\n");
    fprintf(out,"\n\n\ntoken table:\n");
    for(i=0;i<number;i++)
    {   
        if(link[i].Isfirst==0){}
        else if(IsFuhao(link[i].type[0])||IsKey(link[i].data))
        {
            printf("%s          %s\n",link[i].data,link[i].type);
            fprintf(out,"%s          %s\n",link[i].data,link[i].type);
        }
        else
        {
            printf("%s          %s%d\n",link[i].data,link[i].type,i);
            fprintf(out,"%s          %s%d\n",link[i].data,link[i].type,i);
        }
        /*fprintf(out,"%s          %s%d\n",link[i].data,link[i].type,i);  */

    }
        printf("\n\n");
        fprintf(out,"\n\n");
    fprintf(out,"the output token is\n");
    for(i=0;i<tokennumber;i++)
    {
        fprintf(out,"%s ",inToken[i]);
        printf("%s ",inToken[i]);
    }
    fprintf(out,"\n\n\nwen fa fen xi:\n\n");
    printf("\n\nwen fa fen xi:\n");

    parse();
    
    system("pause");
    return 0;

    printf("\nHave succesfully done the operation!");
    getch();
}













⌨️ 快捷键说明

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