for(n=1;string[N][n]!
='\0';n++)
{if(!
zhongjie(s[m])&&!
zhongjie(string[N][n]))
{if(zhongjie(s[m+1])&&zhongjie(string[N][n+1])
&&s[m+1]==string[N][n+1])
{s[j+1]=string[N][0];break;}
}
else
if(zhongjie(s[m]))
if(s[m]==string[N][n])
{s[j+1]=string[N][0];break;}
}
}
k=j+1;
if(k==2&&a=='#')
{out(1,k,s);printf("%c",a);out(i+1,z,input);printf("结束\n");
printf("输入串符合文法的定义!
\n");
return1;//输入串符合文法的定义
}
}
else
if(data[x][y]=='<'||data[x][y]=='=')
{//移进
out(1,k,s);
printf("%c",a);out(i+1,z,input);printf("移进\n");
k++;s[k]=a;i++;
}
else
{printf("\nflase");return0;}
}
printf("\nflase");return0;
}
SLR
(1):
voidmain(){
stringa[12][9]={{"s5","e","e","s4","e","e","1","2","3"},
{"e","s6","e","e","e","ACC","e","e","e"},
{"e","r2","s7","e","r2","r2","e","e","e"},
{"e","r4","r4","e","r4","r4","e","e","e"},
{"s5","e","e","s4","e","e","8","2","3"},
{"e","r6","r6","e","r6","r6","e","e","e"},
{"s5","e","e","s4","e","e","e","9","3"},
{"s5","e","e","s4","e","e","e","e","a"},
{"e","s6","e","e","sb","e","e","e","e"},
{"e","r1","s7","e","r1","r1","e","e","e"},
{"e","r3","r3","e","r3","r3","e","e","e"},
{"e","r5","r5","e","r5","r5","e","e","e"}};
strings[7]={"","E6","E2","T6","T2","F6","F2"};
charc,cc;
stringmyss="";
intflag=0;//看数字或标示符是否结束
listss,ll;
list:
:
iteratormyit;
cout<<"请输入要分析的表达式:
"<while((c=getchar())!
='\n'){
flag=0;
while(isdigit(c)||isalpha(c)){
flag=1;c=getchar();}
if(flag)ss.push_back('I');
if(c=='\n')break;
ss.push_back(c);
}
ss.push_back('$');ll.push_back('$');ll.push_back('0');
while
(1){
if(get(ss.front())!
=-1)//输入栈
myss=a[getI(ll.back())][get(ss.front())];
else{cout<<"错误!
"<if(myss.at(0)=='s'){
ll.push_back(ss.front());//i进入
ss.pop_front();//将I删除
ll.push_back(myss.at
(1));//5进入
}
elseif(myss.at(0)=='r'){
for(inti=0;i
(1)-48].at
(1)-48;i++)
ll.pop_back();//出栈n位
cc=ll.back();//保存当前状态
ll.push_back(s[myss.at
(1)-48].at(0));//大写字母
ll.push_back(a[getI(cc)][get(ll.back())].at(0));
}
elseif(myss.at(0)=='e'){
cout<<"错误!
"<elseif(myss.at(0)=='A'){
cout<<"匹配成功!
"<for(myss="",myit=ll.begin();myit!
=ll.end();myit++)
myss+=*myit;
cout<for(myss="",myit=ss.begin();myit!
=ss.end();myit++)
myss+=*myit;
cout<cout<}
cout<<"分析完毕!
"<}
运行结果:
输入流:
算符优先:
5、实验总结
通过编写算法,对三种方法都有了更好的了解,对编译原理这门课也有了更清晰的认识。