#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;
#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;
}
没有实现()对运算顺序的改变,只能对表达式进行解释。