编译实验部分评价

#include<fstream>
#include<vector>
#include<iostream>
#include<cstring>q
#include"EXP1.cpp"
using namespace std;
int getNum(string s);
void action(string s,int i);
string read(int i);
void Gen(int op, int id1,int id2,int id3);
float TransToNum(char s[]);

int id_count[5]={0,0,0,0,0};//分别对应E,T,F,I,Temp
int P_count=1;
int row=1;
int state[100];
int rec=0;
string Anal[][11]={
    // 1      2       3        4      5       6      7      8         9       10      11
    // (      )        +        -      *      /     i       #         E        T      F
    {"s4"   ,"error","error","error","error","error","s5"   ,"error" ,"1"    ,"2"    ,"3"},//1
    {"error","error","s6"   ,"s7"   ,"error","error","error","acc"   ,"error","error","error"},//2
    {"error","r3"   ,"r3"   ,"r3"   ,"s8"   ,"s9"   ,"error","r3"    ,"error","error","error"},//3
    {"error","r6"   ,"r6"   ,"r6"   ,"r6"   ,"r6"   ,"error","r6"    ,"error","error","error"},//4
    {"s4"   ,"error","error","error","error","error","s5"   ,"error" ,"10"   ,"2"    ,"3"},//5
    {"error","r8"   ,"r8"   ,"r8"   ,"r8"   ,"r8"   ,"error","r8"    ,"error","error","error"},//6
    {"s4"   ,"error","error","error","error","error","s5"   ,"error" ,"error","11"   ,"3"},//7
    {"s4"   ,"error","error","error","error","error","s5"   ,"error" ,"error","12"   ,"3"},//8
    {"s4"   ,"error","error","error","error","error","s5"   ,"error" ,"error","error","13"},//9
    {"s4"   ,"error","error","error","error","error","s5"   ,"error" ,"error","error","14"},//10
    {"error","s15"  ,"s6"   ,"s7"   ,"error","error","error","error" ,"error","error","error"},//11
    {"error","r1"   ,"r1"   ,"r1"   ,"s8"   ,"s9"   ,"error","r1"    ,"error","error","error"},//12
    {"error","r2"   ,"r2"   ,"r2"   ,"s8"   ,"s9"   ,"error","r2"    ,"error","error","error"},//13
    {"error","r4"   ,"r4"   ,"r4"   ,"r4"   ,"r4"   ,"error","r4"    ,"error","error","error"},//14
    {"error","r5"   ,"r5"   ,"r5"   ,"r5"   ,"r5"   ,"error","r5"    ,"error","error","error"},//15
    {"error","r7"   ,"r7"   ,"r7"   ,"r7"   ,"r7"   ,"error","r7"    ,"error","error","error"}//16
    };
string save[]={"(",")","PL","MI","MU","DI","FCON","#","E","T","F","ID","INT"};
    //建立堆栈
vector<pair<int,string> > v1;
//vector<<float> >sematic;
int main(){
    word();
//初始化
state[rec++]=0;
v1.push_back(make_pair(0,"#"));
//读取
string s2=read(row);//待分析字符串的首字母
int i=0;
cout<<s2<<endl;
for(;i<=12;i++)
    if(s2==save[i])
        {if(i==11||i==12)
           i=6;
        break;
        } //得到 列序号i
action(Anal[0][i],i);//查表,i为当前分析符号的下标
return 0;
}
int getNum(string s){
  if(s=="1") return 1;
  if(s=="2") return 2;
  if(s=="3") return 3;
  if(s=="10") return 4;
  if(s=="11")return 5;
  if(s=="12")return 6;
  if(s=="13")return 7;
  if(s=="14")return 8;


  if(s=="s4")return 9;
  if(s=="s5")return 10;
  if(s=="s6")return 11;
  if(s=="s7")return 12;
  if(s=="s8")return 13;
  if(s=="s9")return 14;
  if(s=="s15")return 15;


  if(s=="r1")return 16;
  if(s=="r2")return 17;
  if(s=="r3")return 18;
  if(s=="r4")return 19;
  if(s=="r5")return 20;
  if(s=="r6")return 21;
  if(s=="r7")return 22;
  if(s=="r8")return 23;
  if(s=="acc") return 24;
  if(s=="error") return 99;
    return 0;
}
void action(string s,int i){//动作,带分析的首字符
    cout<<"采取的动作为"<<s<<endl;
    int a=getNum(s);
    char c1,c2;
    int z1,z2;
    int sum;
    int k=0;
    string s1;
switch(a){
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
    case 6:
    case 7:
    case 8:
             c1=s[0];
             if(('0'<=s[1]&&s[1]<='5'))
             {
                  c2=s[1];
                  z1=c1;
                  z2=c2;
                  z1=z1-48;
                  z2=z2-48;
                  sum=z1*10+z2;//
             }
             else
                sum=c1-48;//得到应到达的状态
             action(Anal[sum][i],i);//再次查表
             break;
    case 9:
    case 10:
    case 11:
    case 12:
    case 13:
    case 14:
    case 15:
             c1=s[1];
             if(('0'<=s[2]&&s[2]<='5'))
            {
                  c2=s[2];
                  z1=c1;
                  z2=c2;
                  z1=z1-48;
                  z2=z2-48;
                  sum=z1*10+z2;//
             }
             else
                sum=c1-48;
             v1.push_back(make_pair(sum,save[i]));//
             cout<<"当前状态为"<<sum<<endl;
             state[rec++]=sum;//记录状态栈的变化
             cout<<"移入栈中的符号为"<<(v1.back()).second<<endl;
             s=read(row);//得到待分析字符串的首字母
             cout<<"读取到的字符为"<<s<<endl;
             for(k=0;k<=12;k++)
               if(s==save[k])
                   {
                      if(k==12||k==11)
                          k=6;
                    break;//得到 列序号k
                    }
             action(Anal[sum][k],k);//查表,k为当前分析符号的下标
             break;
   case 16:
            cout<<(v1.back()).second<<endl;
            v1.pop_back();//移除栈顶元素
            cout<<(v1.back()).second<<endl;
            v1.pop_back();
            cout<<(v1.back()).second<<endl;
            v1.pop_back();


            rec=rec-3;//出栈后的状态变化
            cout<<"当前状态为"<<state[rec-1]<<"归约应移入的字符为"<<save[8]<<endl;
            s=Anal[state[rec-1]][8];
            c1=s[0];
             if(('0'<=s[1]&&s[1]<='5'))
             {
                  c2=s[1];
                  z1=c1;
                  z2=c2;
                  z1=z1-48;
                  z2=z2-48;
                  sum=z1*10+z2;//
             }
            else
                sum=c1-48;
            state[rec++]=sum;
            v1.push_back(make_pair(state[rec-1],"E"));
               cout<<"转换到的状态号为:"<<state[rec-1]<<endl;
               id_count[4]++;//temp的数量增加1
               Gen('+',0,1,4);
               P_count++;
               id_count[0]++;
               id_count[1]++;
               Gen('=',4,0,0);
               P_count++;
            action(Anal[state[rec-1]][i],i);//
            break;
   case 17:
            cout<<(v1.back()).second<<endl;
            v1.pop_back();//移除栈顶元素
            cout<<(v1.back()).second<<endl;
            v1.pop_back();
            cout<<(v1.back()).second<<endl;
            v1.pop_back();
            rec=rec-3;//出栈后的状态变化
            cout<<"当前状态为"<<state[rec-1]<<"归约应移入的字符为"<<save[8]<<endl;
            s=Anal[state[rec-1]][8];
            c1=s[0];
             if(('0'<=s[1]&&s[1]<='5'))
             {
                  c2=s[1];
                  z1=c1;
                  z2=c2;
                  z1=z1-48;
                  z2=z2-48;
                  sum=z1*10+z2;//
             }
              else
                sum=c1-48;
            state[rec++]=sum;//字符转数字
            v1.push_back(make_pair(state[rec-1],"E"));
            cout<<"转换到的状态号为:"<<state[rec-1]<<endl;
             id_count[4]++;//temp的数量增加1
            Gen('-',0,1,4);
            P_count++;
            id_count[0]++;
            id_count[1]++;


            Gen('=',4,0,0);
            P_count++;
            action(Anal[state[rec-1]][i],i);//
            break;
   case 18:
           cout<<(v1.back()).second<<endl;
           v1.pop_back();//移除栈顶元素
           rec--;
           cout<<"当前状态为"<<state[rec-1]<<"归约应移入的字符为"<<save[8]<<endl;
           s=Anal[state[rec-1]][8];
             c1=s[0];
             if(('0'<=s[1]&&s[1]<='5'))
             {
                  c2=s[1];
                  z1=c1;
                  z2=c2;
                  z1=z1-48;
                  z2=z2-48;
                  sum=z1*10+z2;//
             }
              else
                sum=c1-48;
           state[rec++]=sum;


           v1.push_back(make_pair(state[rec-1],"E"));
           cout<<"转换到的状态号为:"<<state[rec-1]<<endl;
           Gen('=',1,0,0);
           P_count++;
           id_count[1]++;//T的数量加1
           action(Anal[state[rec-1]][i],i);//
           break;
   case 19:
            cout<<(v1.back()).second<<endl;
            v1.pop_back();//移除栈顶元素
            cout<<(v1.back()).second<<endl;
            v1.pop_back();
            cout<<(v1.back()).second<<endl;
            v1.pop_back();
            rec=rec-3;
           cout<<"当前状态为"<<state[rec-1]<<"归约应移入的字符为"<<save[9]<<endl;
            s=Anal[state[rec-1]][9];
            c1=s[0];
             if(('0'<=s[1]&&s[1]<='5'))
             {
                  c2=s[1];
                  z1=c1;
                  z2=c2;
                  z1=z1-48;
                  z2=z2-48;
                  sum=z1*10+z2;//
             }
              else
                sum=c1-48;
            state[rec++]=sum;
            v1.push_back(make_pair(state[rec-1],"T"));
            cout<<"转换到的状态号为:"<<state[rec-1]<<endl;
            id_count[4]++;//temp的数量增加1
            Gen('*',1,2,4);
            P_count++;
            id_count[1]++;
            id_count[2]++;
            Gen('=',4,0,1);
            P_count++;
            action(Anal[state[rec-1]][i],i);//
            break;
   case 20:
            cout<<(v1.back()).second<<endl;
            v1.pop_back();//移除栈顶元素
            cout<<(v1.back()).second<<endl;
            v1.pop_back();
            cout<<(v1.back()).second<<endl;
            v1.pop_back();
            rec=rec-3;
           cout<<"当前状态为"<<state[rec-1]<<"归约应移入的字符为"<<save[9]<<endl;
            s=Anal[state[rec-1]][9];
              c1=s[0];
             if(('0'<=s[1]&&s[1]<='5'))
             {
                  c2=s[1];
                  z1=c1;
                  z2=c2;
                  z1=z1-48;
                  z2=z2-48;
                  sum=z1*10+z2;//
             }
              else
                sum=c1-48;
            state[rec++]=sum;
            v1.push_back(make_pair(state[rec-1],"T"));
            cout<<"转换到的状态号为:"<<state[rec-1]<<endl;
             id_count[4]++;//temp的数量增加1
            Gen('/',1,2,4);
            cout<<"case 20  bei  zhi  xing "<<endl;


            P_count++;
            id_count[1]++;
            id_count[2]++;
            Gen('=',4,0,1);
            P_count++;
            action(Anal[state[rec-1]][i],i);//
            break;
   case 21:
            cout<<(v1.back()).second<<endl;
            v1.pop_back();//移除栈顶元素
            rec--;
            cout<<"当前状态为"<<state[rec-1]<<"归约应移入的字符为"<<save[9]<<endl;
            s=Anal[state[rec-1]][9];
              c1=s[0];
             if(('0'<=s[1]&&s[1]<='5'))
             {
                  c2=s[1];
                  z1=c1;
                  z2=c2;
                  z1=z1-48;
                  z2=z2-48;
                  sum=z1*10+z2;//
             }
              else
                sum=c1-48;
            state[rec++]=sum;
            v1.push_back(make_pair(state[rec-1],"T"));
            cout<<"转换到的状态号为:"<<state[rec-1]<<endl;
            Gen('=',2,0,1);//F的数量加1
            P_count++;
            id_count[2]++;
            action(Anal[state[rec-1]][i],i);//
            break;
   case 22:
           cout<<(v1.back()).second<<endl;
            v1.pop_back();//移除栈顶元素
            cout<<(v1.back()).second<<endl;
            v1.pop_back();
            cout<<(v1.back()).second<<endl;
            v1.pop_back();
            rec=rec-3;
           cout<<"当前状态为"<<state[rec-1]<<"归约应移入的字符为"<<save[10]<<endl;
            s=Anal[state[rec-1]][10];
             c1=s[0];
             if(('0'<=s[1]&&s[1]<='5'))
             {
                  c2=s[1];
                  z1=c1;
                  z2=c2;
                  z1=z1-48;
                  z2=z2-48;
                  sum=z1*10+z2;//
             }
              else
                sum=c1-48;
            state[rec++]=sum;
            v1.push_back(make_pair(state[rec-1],"F"));
            cout<<"转换到的状态号为:"<<state[rec-1]<<endl;
           Gen('=',0,0,3);
           P_count++;
           id_count[0]++;
           action(Anal[state[rec-1]][i],i);//
            break;
   case 23:cout<<(v1.back()).second<<endl;
            v1.pop_back();//移除栈顶元素
            rec--;
           cout<<"当前状态为"<<state[rec-1]<<"归约应移入的字符为"<<save[10]<<endl;
            s=Anal[state[rec-1]][10];
            c1=s[0];
             if(('0'<=s[1]&&s[1]<='5'))
             {
                  c2=s[1];
                  z1=c1;
                  z2=c2;
                  z1=z1-48;
                  z2=z2-48;
                  sum=z1*10+z2;//
             }
              else
                sum=c1-48;
            state[rec++]=sum;
            v1.push_back(make_pair(state[rec-1],"F"));
            cout<<"转换到的状态号为:"<<state[rec-1]<<endl;
            Gen('=',3,0,2);
            P_count++;
            id_count[3]++;//I的数量加1
            action(Anal[state[rec-1]][i],i);//
            break;
  case  24:cout<<"acc"<<endl;break;


  case 99:
          cout<<"error"<<endl;break;


}
}
string read(int i){//读取没有问题
//读取2.txt字符
fstream fout;
float fnum;
fout.open("c:\\Users\\Lingcheng\\Desktop\\2.txt",ios::in);//打开文件
string s1,s2;
char s[20];
char ss[20];
int k=0;
for(;k<i&&!fout.eof();k++)
    {
        fout.getline(s,20,',');//读取文本内容的第i行到s  读取的是类别码
        fout.getline(ss,20,'\n');//读取的是值;
        if(k<i-1)
            s[0]='\0';
    }
s1=s;
s2=s1.substr(1,s1.length());//得到有意义的字符序列s2,作为被处理数据


if(s2=="FCON"||s2=="ID"||s2=="INT"){
    s1=ss;
    s1=s1.substr(0,s1.length()-1);//
    strncpy(ss,s1.c_str(),s1.length());
    fnum=TransToNum(ss);//获取标识符,flaot,int的值
    //sematic.push_back(fnum);//入栈的都是I的值,入栈顺序不等于运算顺序
}
fout.close();
row++;
return s2;
}


void word(){
FILE *fp=fopen("C:\\Users\\LingCheng\\Desktop\\1.txt","r");
FILE *fp1=fopen("C:\\Users\\LingCheng\\Desktop\\2.txt","w");
int c=0;
c=fgetc(fp);
while(c!=-1)//-1代表文件结束
{
    while(c==' '||c==' ')
     {
        c=fgetc(fp);
     }//读入第一个非空字符
     scanner_example(fp,fp1,c);
    if(record==-1)
        c=-1;
c=fgetc(fp);


}cout<<"读取结束"<<endl;
out(1,"#",fp1);
fclose(fp1);
fclose(fp);
return ;
}
void scanner_example (FILE *fp,FILE *fp1,int c)//读取fp1,写到fp2。c是读取到的字符。
{
    char token[20]={'a'};
    int i=0;//i记录token
    if (isalpha(c))
   {
          token[0]=c;
     c=fgetc(fp);


          if(c==-1)
       { out(ID,token,fp1);//文件结束,余留字符作为标识符输出
     record=-1;return;
   }
          bool b=false;//判断是否为含有数字的标识符
          while (isdigit(c))
     {
              token[++i]=c;
              c=fgetc(fp);
     if(c==-1)
   { out(ID,token,fp1);
         record=-1;return;
                }
              b=true;
      }//确定为含数字的标识符
          while(isalpha(c))
             {
               token[i]=c;
      i++;
               c=fgetc(fp);
  if(c==-1){
  break;}
             }
          fseek(fp,-1,1);//字母结尾的标识符
          if(!b)//判断是否为含有数字的标识符
            {
                for(int k=0;k<7;k++)
                     if(!strcmp(token,g[k]))
            {
           out(k+1,a[k],fp1);
           return;
                     }//判断是否为关键字
                out(ID,token,fp1);
                return;


            }
   else
       {
             token[i]='\0';
        cout<<"ID"<<token<<endl;
             out(ID,token,fp1);//标识符输出
        return ;
        }
    }//判断完关键字和标识符
else if(isdigit(c))
{     bool b=false;//确定是否为浮点数
      token[0]=c;
      c=fgetc(fp);
      if(c==-1)
          {  out(INT,token,fp1);
c=-1;
    record=-1;return;
 }
      i=1;
      while(isdigit(c))
   {
           token[i]=c;
           i++;
           c=fgetc(fp);
   if(c==-1)
  {  out(INT,token,fp1);
                c=-1;
       record=-1;return;
    }
    }//整数部分
 if(c=='.')
   {
  token[i++]=c;
  b=true;
  c=fgetc(fp);
      if(c==-1)
  { out(FCON,token,fp1);
c=-1;
    record=-1;return;
  }
   }
  if(isalpha(c))
 {
 fputs("error",fp1);
 fputc('\n',fp1);
 }
  if((c=='+')||(c=='-')||(c=='*')||(c=='\\'))
  {
  out(INT,token,fp1);
  goto LA;
  }


  while(isdigit(c))
    {
           token[i]=c;
           i++;
           c=fgetc(fp);
      if(c==-1)
          { out(FCON,token,fp1);
        record=-1;return;
               }
    }//小数部分
 if((c=='+')||(c=='-')||(c=='*')||(c=='\\'))
  {
  out(FCON,token,fp1);
  goto LA;
  }
     token[i]= '\0';
     fseek(fp,-1,1);
     if(b)
       {  out(FCON,token,fp1);
return ;
       }
     else
      {
out(INT,token,fp1);
return;
      }
}//区分完整数和浮点数
else
LA:switch(c)
{
  case '<':
            c=fgetc(fp);
            if(c=='='&&c!=-1)
                 out(LE,"LE",fp1);
            else if(c=='>'&&c!=-1)
                 out (NE,"NE",fp1);
            else
       {
               fseek (fp,-1,1);
               out (LT,"LT",fp1);
       }
         break;
  case '=':
          out(EQ, "EQ",fp1);
          break;
case '>':
          c=fgetc(fp);
    if(c==-1)
 { fputs(token,fp1);
    record=-1;return;
 }
        if(c=='=')
             out(GE,"GE",fp1);
        else
{
         fseek(fp,-1,1);
         out(GT,"GT",fp1);
}
         break;
case ':':
     c=fgetc(fp);
    if(c==-1)
 {   fputs(token,fp1);
    record=-1;return;
 }
 if(c=='=')
 out(16,"IS",fp1);
 else
 {
 fputs("error",fp1);
 }break;
case '+': out(17,"PL",fp1);break;
case '-': out(18,"MI",fp1);break;
case '*': out(19,"MU",fp1);break;
case '/': out(20,"DI",fp1);break;
default :cout<<"error"<<endl; break;
}


}
void out(int d,char *s,FILE *fp1){
fputc('(',fp1);
if((1<=d&&d<=7)||(10<=d&&d<21))
  {  fputs(s,fp1);
     fputc(',',fp1);
    fputc(')',fp1);
fputc('\n',fp1);
   }//保留字的输出方式
else
 {  fputs(a[d-1],fp1);
    fputc(',',fp1);
    fputs(s,fp1);
    fputc(')',fp1);
    fputc('\n',fp1);
  }//标识符和浮点数,整数的输出形式
}
void Gen(int op, int id1,int id2,int id3){
   /* int id1=1;
    int id2=2;
    int id3=3;
    int op='+';*/
    ofstream fin;
    fin.open("C:\\Users\\LingCheng\\Desktop\\yuyi.txt",ios::app);
    if(!fin){
        cout<<"打开错误"<<endl;
    }
    char cmp[]={'+','-','*','/','='};
    string cmp2[]={"+","-","*","/","="};
    string id_s[]={"E","T","F","I","Temp"};//0 , 1, 2, 3, 4
    switch(op){
case '+':
       fin<<"  "<<P_count<<" "<<":"<<"("<<"+"<<","<<id_s[id1]<<id_count[id1]<<","
                <<id_s[id2]<<id_count[id2]<<","<<id_s[id3]<<id_count[id3]<<")"<<'\n';
                fin.close();
                break;//(+,T,T,E)
case '-':
       fin<<"  "<<P_count<<" "<<":"<<"("<<"-"<<","<<id_s[id1]<<id_count[id1]<<","
                <<id_s[id2]<<id_count[id2]<<","<<id_s[id3]<<id_count[id3]<<")"<<'\n';
                fin.close();
                break;
case 42:
       fin<<"  "<<P_count<<" "<<":"<<"("<<" * "<<","<<id_s[id1]<<id_count[id1]<<","
                <<id_s[id2]<<id_count[id2]<<","<<id_s[id3]<<id_count[id3]<<")"<<"乘法"<<'\n';
                fin.close();
                break;
case '/':
      fin<<"  "<<P_count<<" "<<":"<<"("<<"/"<<","<<id_s[id1]<<id_count[id1]<<","
                <<id_s[id2]<<id_count[id2]<<","<<id_s[id3]<<id_count[id3]<<")"<<'\n';
                fin.close();
                break;
case '=':
     fin<<"  "<<P_count<<" "<<":"<<"("<<"="<<","<<id_s[id1]<<id_count[id1]<<","
                <<0<<","<<id_s[id3]<<id_count[id3]<<")"<<'\n';
                fin.close();
                break;


    }


}
float TransToNum(char s[])
{
    double t=0.0;
    sscanf(s,"%lf",&t);
    float a;
    a=(float)t;
    cout<<t<<"        "<<endl;
    cout<<"转化为数字"<<endl;
    return a;

}

没有实现()对运算顺序的改变,只能对表达式进行解释。








猜你喜欢

转载自blog.csdn.net/zenglingcheng/article/details/78863874