Advertisement
Guest User

Untitled

a guest
May 22nd, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 11.39 KB | None | 0 0
  1. /*
  2.  
  3. INPUT FILE kk.txt
  4.  
  5.  
  6. macro ddd &a,&b,&reg=AREG
  7. lcl &m
  8. &m set 0
  9. mover &reg,&a
  10. mend
  11. start
  12. MOVER AREG,='2'
  13. ddd 2,4
  14. end
  15. */
  16.  
  17.  
  18.  
  19.  
  20. #include<stdio.h>
  21. #include<conio.h>
  22.  
  23. struct pntab{
  24. char var[15];
  25. }p1[20];
  26.  
  27. struct evntab{
  28. char var[15];
  29. }e1[20];
  30.  
  31. struct ssntab{
  32. char lb[15];
  33. }s1[20];
  34.  
  35. struct mnt{
  36. char mname[20];
  37. int pp,kp,ev,mdtp,kpdtp,sstp;
  38. }m1[10];
  39.  
  40. struct kptab{
  41. char var[15],val[15];
  42. }k1[20];
  43.  
  44. struct sstab{
  45. int lbp;
  46. }ss1[20];
  47.  
  48. struct mdt{
  49. char stmt[50];
  50. }mm1[50];
  51.  
  52.  
  53. struct aptab{
  54. char val[20];
  55. }a1[20];
  56.  
  57. void main()
  58. {
  59.  int kp=1,sp=1,mp=1,snp=1,pnp=1,evp=1,l=1,ap=1,i,j,k,nl,kl,me,cn,opt,e=0,en,mac,a,z,x,pr;
  60.  char fn[15],str[30],str1[30],str2[50];
  61.  
  62.  FILE *f1,*f2;
  63.  
  64.  
  65.     f1=NULL;
  66. //  printf("\n\nenter the source file name\n\n");
  67. //  scanf("%s",fn);
  68. //  f1=fopen(fn,"rb");
  69.     f1=fopen("kk.txt",rb);
  70.  
  71.     while(f1==NULL)
  72.     {
  73.         printf("\n\nSuch file not exists\n\n");
  74.         printf("\n\nEnter the valid file name\n\n");
  75.         scanf("%s",fn);
  76.         f1=fopen(fn,"rb");
  77.     }
  78.  
  79.  
  80. while(e==0)                             //while eof
  81.  {
  82.    i=0;
  83.    do
  84.     {
  85.       str[i]=fgetc(f1);
  86.       if(str[i]==EOF)
  87.        {
  88.     e=1;
  89.     break;
  90.        }
  91.       if(str[i]=='\n'||str[i]=='\r')
  92.        {
  93.     i++;
  94.     break;
  95.        }
  96.     }while(str[i++]!=' ');
  97.  
  98.     i--;
  99.     str[i]='\0';
  100.  
  101.     if(strcmp(str,"START")==NULL)                   //if start kw appears
  102.      {e=1;
  103.       break;}
  104.  
  105.  
  106.     if(!strcmp(str,"macro")||!strcmp(str,"MACRO"))          //if a macro kw
  107.      {
  108.  
  109.        i=0;
  110.        do
  111.     {
  112.     str[i]=fgetc(f1);
  113.  
  114.     if(str[i]=='\n'||str[i]=='\r')
  115.       {
  116.       i++;
  117.       break;
  118.       }
  119.     if(str[i]==EOF)
  120.       {
  121.       i++;
  122.       e=1;
  123.       break;
  124.       }                             //name of macro
  125.     }while(str[i++]!=' ');
  126.     i--;
  127.     str[i]='\0';
  128.  
  129.  
  130.  
  131.     strcpy(m1[l].mname,str);
  132.     nl=0;
  133.     while(nl==0)
  134.     {
  135.       i=0;
  136.       //nl=0;
  137.       kl=0;
  138.       do
  139.         {
  140.        //  if(kl==0)
  141.            str[i]=fgetc(f1);
  142.        //  else
  143.          //  str1[i]=fgetc(f1);
  144.          if(str[i]=='\n'||str[i]=='\r')                     //parameters of macro
  145.            {
  146.         nl=1;
  147.         i++;
  148.         break;
  149.            }
  150.          if(str[i]==EOF)                        //updating mnt
  151.            {
  152.         i++;
  153.         e=1;
  154.         break;
  155.            }
  156.          if(str[i]=='=')
  157.            {
  158.            //   str[i-1]='\0';
  159.            i++;
  160.         kl=1;
  161.          break;
  162.            }
  163.          if(str[i]=='&')
  164.          { i--;
  165.            continue;
  166.          }
  167.        }while(str[i++]!=',');
  168.       i--;
  169.       str[i]='\0';
  170.  
  171.  
  172.     if(kl==1)
  173.      {
  174.       i=0;
  175.       do
  176.         {
  177.       //   if(kl==0)
  178.         //   str[i]=fgetc(f1);
  179.         // else
  180.            str1[i]=fgetc(f1);
  181.          if(str1[i]=='\n'||str1[i]=='\r')                       //parameters of macro
  182.            {
  183.         nl=1;
  184.         i++;
  185.         break;
  186.            }
  187.          if(str[i]==EOF)                        //updating mnt
  188.            {
  189.         i++;
  190.         e=1;
  191.         break;
  192.            }
  193.        }while(str[i++]!=',');
  194.       i--;
  195.       str1[i]='\0';
  196.      }
  197.  
  198.  
  199.  
  200.       if(kl==0)
  201.        {
  202.         strcpy(p1[pnp++].var,str);
  203.         m1[l].pp++;
  204.        }
  205.       m1[l].kpdtp=kp;
  206.       if(kl==1)
  207.        {
  208.         strcpy(k1[kp].var,str);
  209.         strcpy(k1[kp++].val,str1);
  210.         strcpy(p1[pnp++].var,str);
  211.         m1[l].kp++;
  212.        }
  213.       m1[l].mdtp=mp;
  214.       m1[l].ev=0;
  215.       m1[l].sstp=sp;
  216.     }                               //while(nl==0)
  217.  
  218.            str[i]=fgetc(f1);                        //processing macro stmt
  219.  
  220.     me=1;
  221.        i=0;
  222.        do
  223.          {
  224.            str[i]=fgetc(f1);                        //processing macro stmt
  225.            if(str[i]==EOF)
  226.         {
  227.          e=1;
  228.          break;
  229.         }
  230.           if(str[i]=='\n'||str[i]=='\r')
  231.         {
  232.             i++;
  233.             break;
  234.         }
  235.  
  236.          }while(str[i++]!=' ');
  237.  
  238.        i--;
  239.        str[i]='\0';
  240.        if(strcmp(str,"mend")==0||strcmp(str,"MEND")==0)
  241.           me=0;
  242.     while(me==1)
  243.      {
  244.        i=0;
  245.  
  246.        do
  247.          {
  248.            str1[i]=fgetc(f1);
  249.            if(str1[i]==EOF)
  250.         {
  251.          e=1;
  252.          break;
  253.         }
  254.            if(str1[i]=='\n'||str1[i]=='\r')
  255.            {
  256.         i++;
  257.         break;
  258.            }
  259.  
  260.          }while(str1[i++]!=' ');
  261.  
  262.        i--;
  263.        str1[i]='\0';
  264.  
  265.        if(strcmp(str,"LCL")==0||strcmp(str,"lcl")==0)       //if lcl stmt
  266.         {
  267.           for (i=0;i<strlen(str);i++)
  268.         str1[i]=str1[i+1];
  269.           strcpy(e1[evp++].var,str1);
  270.           m1[l].ev++;
  271.           sprintf(str2,"LCL (E,%d)",evp);
  272.           strcpy();
  273.         }
  274.  
  275.        else if(strcmp(str1,"set")==0||strcmp(str1,"SET")==0)        //if set stmt
  276.         {
  277.           for (i=0;i<strlen(str);i++)
  278.         str[i]=str[i+1];
  279.           for (i=1;i<evp;i++)
  280.            {
  281.          if(strcmp(e1[i].var,str)==0)
  282.          break;
  283.            }
  284.           j=i;
  285.            //    str1[i]=fgetc(f1);
  286.           i=0;
  287.           do
  288.            {
  289.          str1[i]=fgetc(f1);
  290.          if(str1[i]==EOF)
  291.           {
  292.             e=1;
  293.             break;
  294.           }
  295.          if(str1[i]=='\n'||str1[i]=='\r')
  296.           {
  297.             i++;
  298.             break;
  299.           }
  300.  
  301.            }while(str1[i++]!=' ');
  302.  
  303.           i--;
  304.           str1[i]='\0';
  305.           sprintf(str2,"(E,%d) SET ",j);
  306.           cn=1;
  307.           opt=1;
  308.           if(str1[0]=='&')
  309.           while(opt==1)
  310.            {
  311.          k=0;
  312.          for(;str1[cn]!='+'&&str1[cn]!='\n';cn++)
  313.           {
  314.             str[k]=str1[cn];
  315.             k++;
  316.           }
  317.          if(str1[cn]=='+')
  318.             opt=1;
  319.          else
  320.             opt=2;
  321.          if(str[0]=='&')
  322.           {
  323.             for (i=0;i<strlen(str);i++)
  324.                str[i]=str[i+1];
  325.             for (i=1;i<evp;i++)
  326.              {
  327.                if(strcmp(e1[i].var,str)==0)
  328.              break;
  329.              }
  330.             if(opt==1)
  331.                sprintf(str,"(E,%d)+",i);
  332.             if(opt==2)
  333.                sprintf(str,"(E,%d)",i);
  334.             strcat(str2,str);
  335.           }
  336.          else
  337.           {
  338.             i=atoi(str);
  339.             if(opt==1)
  340.               sprintf(str,"%d+",i);
  341.             if(opt==2)
  342.               sprintf(str,"%d",i);
  343.             strcat(str2,str);
  344.           }
  345.         }
  346.            else
  347.         {
  348.           strcat(str2,str1);
  349.         }
  350.         }                                   //end of set processing
  351.  
  352.  
  353.        else if(strcmp(str,"AIF")==0||strcmp(str,"aif")==0||strcmp(str,"AGO")==0||strcmp(str,"ago")==0)
  354.         {
  355.  
  356.         }                                   //aif or ago stmt
  357.  
  358.        else
  359.         {
  360.           sprintf(str2,"%s ",strupr(str));
  361.           cn=1;
  362.           while(opt==1)
  363.            {
  364.          for(i=0;str1[cn]!=','&&str1[cn]!='\0';i++,cn++)
  365.            str[i]=str1[cn];
  366.          if(str1[cn++]==',')
  367.            opt=1;
  368.          else
  369.            opt=2;
  370.          cn++;
  371.  
  372.          str[i]='\0';
  373.          for(i=1;i<pnp;i++)
  374.            if(strcmp(str,p1[i].var)==0)
  375.              break;
  376.          if(opt==1)
  377.          sprintf(str,"(P,%d),",i);
  378.          if(opt==2)
  379.          sprintf(str,"(P,%d)",i);
  380.          strcat(str2,str);
  381.            }
  382.         }
  383.  
  384.        strcpy(mm1[mp++].stmt,str2);
  385.            str[i]=fgetc(f1);                        //processing macro stmt
  386.  
  387.        i=0;
  388.        do
  389.          {
  390.            str[i]=fgetc(f1);                        //processing macro stmt
  391.            if(str[i]==EOF)
  392.         {
  393.          e=1;
  394.          break;
  395.         }
  396.            if(str[i]=='\n'||str[i]=='\r')
  397.         {
  398.          i++;
  399.          break;
  400.         }
  401.  
  402.          }while(str[i++]!=' ');
  403.  
  404.        i--;
  405.        str[i]='\0';
  406.        if(strcmp(str,"mend")==0||strcmp(str,"MEND")==0)
  407.         {
  408.           l++;
  409.           me=0;
  410.         }
  411.  
  412.  
  413.  
  414.      }                                  //while(me==1)
  415.  
  416.      }                                      //if macro stmt
  417.  }                                      //while(e=0)
  418.  
  419.  
  420.  fclose(f1);
  421.  f1=fopen(fn,"rb");
  422.  
  423.  while(strcmp(strupr(str),"START")!=0)
  424.   {
  425.     while(str[i]!='\n')
  426.        str[i]=fgetc(f1);
  427.     i=0;
  428.     do
  429.      {
  430.         str[i]=fgetc(f1);
  431.         if(str[i]==EOF)
  432.          {
  433.             e=1;
  434.             break;
  435.           }
  436.         if(str[i]=='\n'||str[i]=='\r')
  437.           {
  438.             i++;
  439.             break;
  440.           }
  441.      }while(str[i++]!=' ');
  442.     i--;
  443.     str[i]='\0';
  444.   }
  445.  
  446.  f2=fopen("kkm.txt","w");
  447.  
  448.  i=0;
  449.  str1[i]=fgetc(f1);
  450.  if(str1[i++]==' ')
  451.  {
  452.  do
  453.  {
  454.     str1[i]=fgetc(f1);
  455.     if(str[i]==EOF)
  456.      {
  457.         e=1;
  458.         break;
  459.       }
  460.     if(str1[i]=='\n'||str1[i]=='\r')
  461.       {
  462.         i++;
  463.         break;
  464.       }
  465.  }while(str1[i++]!=' ');
  466.  
  467.  i--;
  468.  str1[i]='\0';
  469.  
  470.   fprintf(f2,"%s %s\n",str,str1);
  471.  }
  472.  else
  473.   fprintf(f2,"%s\n",str);
  474.  
  475.   e=0;
  476.   en=0;
  477.  
  478.  
  479.  while(e==0&&en==0)
  480.   {
  481.     mac=0;
  482.     i=0;
  483.     while(mac!=1&&e!=1)
  484.       {
  485. /*      while(str[i]!='\n'&&str1[0]!='\n')
  486.          {
  487.            str[i]=fgetc(f1);
  488.            if(str[i]!='\r')
  489.              fprintf(f2,"%c",str[i]);
  490.          } */
  491.             str1[0]='t';
  492.         i=0;
  493.         pr=0;
  494.         do
  495.         {
  496.             str[i]=fgetc(f1);
  497.             //if(str[i]!='\r')
  498.               // fprintf(f2,"%c",str[i]);
  499.             if(str[i]==EOF)
  500.              {       i++;
  501.                 e=1;
  502.                 break;
  503.              }
  504.             if(str[i]=='\n'||str[i]=='\r')
  505.              {
  506.                 pr=1;
  507.                 i++;
  508.                 break;
  509.              }
  510.         }while(str[i++]!=' ');
  511.         i--;
  512.         str[i]='\0';
  513.  
  514.         for(j=1;j<l;j++)
  515.           if(strcmp(m1[j].mname,str)==0)
  516.           {
  517.            mac=1;
  518.            goto zzz;
  519.           }
  520.  
  521.         if(strcmp(strupr(str),"END")==0)
  522.          {
  523.             for(i=1;i<evp;i++)
  524.             fprintf(f2,"%s DC 0\n",e1[i].var);
  525.             fprintf(f2,"%s\n",str);
  526.             if(e==1)
  527.             {
  528.                 fclose(f2);
  529.                 fclose(f1);
  530.                 exit(0);
  531.             }
  532.          }
  533.  
  534.  
  535.         if(pr==0)
  536.           fprintf(f2,"%s ",str);
  537.         else
  538.         {
  539.           fprintf(f2,"%s\n",str);
  540.             str[i]=fgetc(f1);}
  541.       }
  542.  
  543. zzz:    if(e==1)
  544.       exit(0);
  545.  // j--;
  546.     i=0;
  547.     do
  548.     {
  549.         str1[i]=fgetc(f1);
  550.         if(str1[i]==EOF)
  551.          {
  552.             e=1;
  553.             break;
  554.          }
  555.         if(str1[i]==',')
  556.          {
  557.             str1[i]='\0';
  558.             if(str1[0]>='0'&&str1[0]<='9')
  559.              {
  560.                 str1[i+3]='\0';
  561.                 str1[i+2]=39;
  562.                 for(x=i+1;x>1;x--)
  563.                   str1[x]=str1[x-2];
  564.                 str1[0]='=';
  565.                 str1[1]=39;
  566.              }
  567.             strcpy(a1[ap++].val,str1);
  568.             i=0;
  569.             continue;
  570.          }
  571.         else if(str1[i]=='\r')
  572.          {
  573.             str1[i]='\0';
  574.             if(str1[0]>='0'&&str1[0]<='9')
  575.              {
  576.                 str1[i+3]='\0';
  577.                 str1[i+2]=39;
  578.                 for(x=i+1;x>1;x--)
  579.                   str1[x]=str1[x-2];
  580.                 str1[0]='=';
  581.                 str1[1]=39;
  582.              }
  583.             strcpy(a1[ap++].val,str1);
  584.                     str1[i]=fgetc(f1);
  585.  
  586.             break;
  587.          }
  588.         i++;
  589.     }while(str1[i]!='\n'&&str1[i]!='\r');
  590.  
  591.     if(ap<pnp)
  592.      {
  593.        for(i=1;i<kp;i++)
  594.          strcpy(a1[ap++].val,k1[i].val);
  595.      }
  596.  
  597.     if(j<l-1)
  598.       k=m1[j+1].mdtp;
  599.     else
  600.       k=mp;
  601.  
  602.     for(a=m1[j].mdtp;a<k;a++)
  603.      {
  604.         i=0;
  605.         z=0;
  606.         while(mm1[a].stmt[z]!=' ')
  607.         str[i++]=mm1[a].stmt[z++];
  608.         str[i]='\0';
  609.         z++;
  610.  
  611.         i=0;
  612.         while(mm1[a].stmt[z]!='\0'&&mm1[a].stmt[z]!=' ')
  613.         str1[i++]=mm1[a].stmt[z++];
  614.         str1[i]='\0';
  615.  
  616.         if(mm1[a].stmt[z]=='\0')
  617.           nl=0;
  618.         else
  619.           nl=1;
  620.  
  621.         if(strcmp(str,"LCL")==0)        //if lcl stmt
  622.         {
  623.             continue;
  624.         /*  for(i=3;str[i]!=')';i++)
  625.               str[i-3]=str[i];
  626.             str[i-3]='\0';
  627.             z=atoi(str);
  628.             strcpy(str,e1[z].var);
  629.  
  630.             for (i=0;i<strlen(str);i++)
  631.             str1[i]=str1[i+1];
  632.             strcpy(e1[evp++].var,str1);
  633.             m1[l].ev++;
  634.             sprintf(str2,"LCL (E,%d)",evp);
  635.             strcpy();*/
  636.         }
  637.  
  638.         else if(strcmp(str1,"SET")==0)      //if set stmt
  639.         {
  640.             for(i=3;str[i]!=')';i++)
  641.               str[i-3]=str[i];
  642.             str[i-3]='\0';
  643.             i=atoi(str);
  644.             strcpy(str,e1[i].var);
  645.  
  646.             i=0;
  647.             z++;
  648.             while(mm1[a].stmt[z]!='\0')
  649.             str1[i++]=mm1[a].stmt[z++];
  650.             str1[i]='\0';
  651.             z=atoi(str1);
  652.  
  653.             fprintf(f2,"MOVER AREG,='%d'\nMOVEM AREG,%s\n",z,str);
  654.         }                                   //end of set processing
  655.  
  656.  
  657.         //  else if(strcmp(str,"AIF")==0||strcmp(str,"aif")==0||strcmp(str,"AGO")==0||strcmp(str,"ago")==0)
  658.         //  {
  659.  
  660.         //  }                                   //aif or ago stmt
  661.  
  662.         else
  663.          {
  664.  
  665.             fprintf(f2,"%s ",strupr(str));
  666.             i=0;
  667.             while(str1[i]!='\0')
  668.              {
  669.                 if(str1[i]=='('&&str1[i+1]=='E')
  670.                   {
  671.                     i+=3;
  672.                     k=0;
  673.                     while(str1[i]!=')')
  674.                         str[k++]=str1[i++];
  675.                     str[k]='\0';
  676.                     k=atoi(str);
  677.                     fprintf(f2,"%s",e1[k].var);
  678.                     i++;
  679.                     if(str1[i]==',')
  680.                      {
  681.                         fprintf(f2,",");
  682.                         i++;
  683.                      }
  684.                     if(str1[i]=='\0')
  685.                         fprintf(f2,"\n");
  686.                   }
  687.  
  688.                 else if(str1[i]=='('&&str1[i+1]=='P')
  689.                   {
  690.                     i+=3;
  691.                     k=0;
  692.                     while(str1[i]!=')')
  693.                         str[k++]=str1[i++];
  694.                     str[k]='\0';
  695.                     k=atoi(str);
  696.                     fprintf(f2,"%s",a1[k].val);
  697.                     i++;
  698.                     if(str1[i]==',')
  699.                      {
  700.                         fprintf(f2,",");
  701.                         i++;
  702.                      }
  703.                     if(str1[i]=='\0')
  704.                         fprintf(f2,"\n");
  705.                   }
  706.  
  707.                 else
  708.                   {
  709.                     k=0;
  710.                     while(str1[i]!='\0'||str1[i]!=',')
  711.                         str[k++]=str1[i++];
  712.                     str[k]='\0';
  713.                     fprintf(f2,"%s",strupr(str));
  714.                     if(str1[i]==',')
  715.                      {
  716.                         fprintf(f2,",");
  717.                         i++;
  718.                      }
  719.                     if(str1[i]=='\0')
  720.                         fprintf(f2,"\n");
  721.                   }
  722.              }
  723.          }
  724.      }                                                                             //macro expansion     for(a=m1[j].mdtp;a<k;a++)
  725.   }                                 //while(e==0||en==0)
  726.  
  727. }
  728.                                         //main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement