#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
/*
广西师范大学 计算机科学与工程学院
GuangXi Normal University College of Computer Science and Engineering
Student STZ
*/
string map[6][7]={
{ "", "i", "+", "*", "(",")","#"},
{"E", "TD", "", "", "TD", "", ""},
{"D", "","+TD", "", "","e","e"},
{"T", "FS", "", "", "FS", "", ""},
{"S", "", "e","*FS", "","e","e"},
{"F", "i", "", "","(E)", "", ""},
};
char input[] = "i+i*i#";
char start[] = "#E";
void match(int l,int c){
// int len = map[l][c].length();//替换串的长度
int i = 0;
int isfirst = 0;
cout<<start[strlen(start)-1]<<"->"<<map[l][c]<<endl;
for(string::reverse_iterator iter=map[l][c].rbegin();iter!=map[l][c].rend();iter++){//反向迭代
if(isfirst==0){
start[strlen(start)-1] = *iter;
isfirst=1;
}else{
start[strlen(start)] = *iter;
}
for(int j=0;j<6;j++){
printf("%c",start[j]);
}cout<<endl;
}
int analysis(char l,char c){
int flag = 1;
int i,j;
string L = "";
L += l;
string C = "";
C +=c;
//cout<<l<<endl;
for(i=1;i<6;++i){
if(L.compare(map[i][0])==0){//匹配到行
break;
}
}
// cout<<i<<endl;
// i--;
for(j=1;j<7;++j){
if(C.compare(map[0][j])==0){//匹配到列
break;
}
}
// cout<<j<<endl;
// j--;
if(map[0][j].compare("")!=0){
match(i,j);//
return 1;
}else{
cout<<l<<"不匹配"<<map[0][j]<<" map为:"<<map[i][j]<<endl;
return 0;
}
}
int main(){
int flag = 1;
while(flag){
cout<<endl<<"当前start状态:";
for(int j=0;j<6;j++){
printf("%c",start[j]);
}cout<<endl;
cout<<"当前input状态:"<<input<<endl;
if(start[strlen(start)-1] == input[0]){//如果栈尾和剩余字符串队首一样先消除;
start[strlen(start)-1]='\0';
for(int i=0;i<strlen(input)-1;i++){
input[i] = input[i+1];
}
input[strlen(input)-1]='\0';
cout<<endl<<"消除成功!\n当前start状态:"<<start<<"\n当前input状态:"<<input<<endl;
}
else if(start[strlen(start)-1]=='e'){//如果最后一位是空,自动去掉
start[strlen(start)-1]='\0';
}
else
flag = analysis(start[strlen(start)-1],input[0]);//如果栈尾和剩余字符串队首不一样;
if(flag==0){
cout<<"编译出错!!"<<endl;
break;
}
if(strlen(input)==0){
cout<<"END!!"<<endl;
break;
}
}
return 0;
}