#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define MAXSIZE 100
typedef struct{
char *base;
char *top;
}Sqstack;
//手动构造预测分析表 42个字符串
char* str[6][7]={" " , "i" , "+" , "*" , "(" , ")" , "#" ,
"E" , "TH" , " " , " " , "TH" , " " , " ",
"H" , " " , "+TH" , " " ," " , "e" ,"e",
"T" , "FY" , " " , " " , "FY" , " " , " ",
"Y" , " " , "e" , "*FY" , " " , "e" , "e",
"F" , "i" , " " , " " , "(E)" , " " , " "
};
/*初始化顺序栈*/
void Creatstack(Sqstack &S)
{
S.base = new char[MAXSIZE];/*base指向第0个元素*/
S.top = S.base;
}
/*判断栈是否为空*/
int stackempty(Sqstack &S)
{
if(S.base == S.top)
return 1;
else
return 0;
}
/*入栈*/
void push(Sqstack &S,char e)
{
*S.top++ = e;
}
/*出栈*/
void pop(Sqstack &S)
{
--S.top;
}
/*获取栈顶元素*/
char gettop(Sqstack &S)
{
--S.top;
return *S.top;
}
/*把栈里的内容输出*/
void showstack(Sqstack &S)
{
int i = 0;//记步
while(S.top != S.base)
{
printf("%c",*S.base);
S.base++;
i++;
}
//把栈还原成原来的样子
while(i != 0)
{
S.base--;
i--;
}
}
void showinput(char *p)
{
int i = 0;
while(*p != '\0')
{
printf("%c ",*p);
p++;
i++;
}
//将p指向原来的位置
while(i != 0)
{
p--;
i--;
}
}
void main()
{
int test = 0;
//建立栈
Sqstack S;
char ch;
char *p;
char *s;
int i,j;
int a,b;
int z;
int k;
//要验证的i+i*i
char *input = "i+i*i#";
p = input;
Creatstack(S);
//将#入栈
push(S,'#');
//文法开始符入栈
push(S,'E');
while(S.base != S.top)
{
showstack(S);
printf(" ");
showinput(p);
printf(" ");
//找栈顶元素的和输入串的首元素
ch = gettop(S);
//获取之后还要还原
S.top++;
if(ch == *p && *p != '\0')
{
pop(S);
p++;
printf("匹配成功");
printf("\n");
}
else{
for(i = 0;i < 6;i++)
{
if(*str[i][0] == ch)
{
a = i;
}
}
for(j = 0;j < 7;j++)
{
if(*str[0][j] == *p)
{
b = j;
}
}
if(str[a][b] == "e")
{
pop(S);
}
else
{
pop(S);
//逆序
s = str[a][b];
z = 0;
while(*s != '\0')
{
s++;
z++;
}
s--;
//z--;
while(z != 0)
{
push(S,*s);
s--;
z--;
}
}
printf("%c -> %s \n",ch,str[a][b]);//find
}
}
}