📄 ll1.cpp
字号:
#include <iostream.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
# define SIZE 40
/*int char_num(char ch)
{
switch(ch)
{
case '+':return 0;
case '-':return 1;
case '*':return 2;
case '/':return 3;
case '(':return 4;
case ')':return 5;
case 'i':return 6;
case '#':return 7;
default :return -1;
}
}
int expression_num(char ch)
{
switch(ch)
{
case 'E':return 0;
case 'T':return 1;
case 'G':return 2;
case 'F':return 3;
case 'S':return 4;
default :return -1;
}
}*/
int char_num(char ch)
{
switch(ch)
{
case 'i':return 0;
case '+':return 1;
case '*':return 2;
case '(':return 3;
case ')':return 4;
case '#':return 5;
default :return -1;
}
}
int expression_num(char ch)
{
switch(ch)
{
case 'E':return 0;
case 'G':return 1;
case 'T':return 2;
case 'S':return 3;
case 'F':return 4;
default :return -1;
}
}
struct anay_str {
char *str;
};
struct analysis_stack {
char *base;
char *top;
int stacksize;
};
char Pop(analysis_stack& S)
{
if(S.base==S.top) cout<<"字符栈为空,不能输出";
char x=*(--S.top);
//cout<<"出栈字符为"<<x<<endl;
return x;
}
void InitStack_stack(analysis_stack& S)
{
S.base=(char *)malloc(SIZE *sizeof(char));
if(!S.base) {
cout<<"errer abc"<<endl;
exit(1);
}
S.top=S.base;
S.stacksize=40;
}
void Push(analysis_stack& S,char e)
{
*S.top++=e;
//cout<<e<<"已经被放入字符栈中"<<endl;
}
void out_string(char* ch,int n)
{
while(ch[n])
{
cout<<ch[n];
n++;
}
}
void out_stack(analysis_stack& S)
{
int i=0;
while((S.base+i)!=S.top)
{
cout<<*(S.base+i);
i++;
}
}
void main()
{
analysis_stack m;
InitStack_stack(m);
int len=0,num1,num2;
/*struct anay_str store[5][8]={{{""},{""},{""},{""},{"TG"},{""},{"TG"}},
{{""},{""},{""},{""},{"FS"},{""},{"FS"}},
{{"+TG"},{"-TG"},{""},{""},{""},{"e"},{""},{"e"}},
{{""},{""},{""},{""},{"(E)"},{""},{"i"}},
{{"e"},{"e"},{"*FS"},{"/FS"},{""},{"e"},{""},{"e"}},
};*/
struct anay_str store[5][6]={{{"TG"},{""},{""},{"TG"}},
{{""},{"+TG"},{""},{""},{"e"},{"e"}},
{{"FS"},{""},{""},{"FS"}},
{{""},{"e"},{"*FS"},{""},{"e"},{"e"}},
{{"i"},{""},{""},{"(E)"}},
};
char* In_putstr;
In_putstr="i+i*i#";
cout<<In_putstr<<endl;
int j=0,k=1;
*m.top++='#';
*m.top++='E';
cout<<"步骤 分析栈 剩余输入串 所用产生式 \n";
while(*(m.top-1)!='#'||In_putstr[j]!='#')
{
cout<<"\n"<<k++<<"\t\t";
out_stack(m);
cout<<"\t\t";
out_string(In_putstr,j);
cout<<"\t\t\t";
if(!(expression_num(*(m.top-1))||char_num(*(m.top-1)))||char_num(In_putstr[j])==-1)/////////////////////////////////////////////////////
{
cout<<"输入的输入串有错误"<<endl;
break;
}
else
{
if(char_num(*(m.top-1))>=0)
{
if(*(m.top-1)==In_putstr[j])
{
Pop(m);
cout<<"\""<<In_putstr[j]<<"\""<<"匹配";
j++;
continue;
}
else
{
cout<<"匹配错误"<<endl;
break;
}
}
else
{
len=strlen(store[expression_num(*(m.top-1))][char_num(In_putstr[j])].str);
cout<<Pop(m)<<"-->"<<store[expression_num(*(m.top-1))][char_num(In_putstr[j])].str;
num1=expression_num(*(m.top));
num2=char_num(In_putstr[j]);
for(int i=len-1;i>=0;i--) ///////////////////////
Push(m,store[num1][num2].str[i]);
if(*(m.top-1)=='e')
{
Pop(m);
continue;
}
}
}
}
if(*(m.top-1)=='#'&&In_putstr[j]=='#')
{
cout<<endl;
cout<<k<<"\t\t"<<'#'<<"\t\t"<<'#'<<"\t\t\t"<<"接受\n";
cout<<"恭喜,语句分析成功\n";
}
else
cout<<"语句分析失败";
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -