编译原理预测分析法附源码Word格式文档下载.docx
《编译原理预测分析法附源码Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《编译原理预测分析法附源码Word格式文档下载.docx(5页珍藏版)》请在冰点文库上搜索。
//初始化的栈的大小
//非终结符数组集
charVar[5]={'
E'
'
R'
T'
M'
F'
};
//终结符数组集
charTer[6]={'
i'
+'
*'
('
)'
#'
stringpred[5][6]={{"
TR"
"
"
},{"
+TR"
@"
FM"
*FM"
i"
(E)"
}};
typedefstruct{
char*top;
char*base;
intstacksize;
intnum;
}Stack;
//栈结构体
voidinit(Stack*ss){//初始化栈
ss->
base=(char*)malloc(NUM*sizeof(char));
if(!
ss->
base)
exit
(1);
top=ss->
base;
stacksize=NUM;
num=0;
}
voidpush(Stack*ss,charc){//入栈操作
if(ss->
top-ss->
base>
=ss->
stacksize)
*(ss->
top)=c;
top++;
num++;
voidpop(Stack*ss){//出栈操作
top==ss->
top--;
num--;
chargetTop(Stack*ss){//取得栈顶元素
return*(ss->
top-1);
intisT(charc){//判断是否为终结符
inti=0;
intret=0;
for(i=0;
i<
6;
i++){
if(Ter[i]==c)
{
ret=1;
break;
}
}
returnret;
stringisInPred(charv,chart){//查找预测分析表,并返回产生式右部
inti,j;
5;
i++)
{
if(Var[i]==v)
break;
for(j=0;
j<
j++)
if(Ter[j]==t)
if(pred[i][j]!
="
)
returnpred[i][j];
else
return"
;
voiddisplayStack(Stack*stack){ //输出分析站的内容
stringstr;
Stackss=*stack;
while(ss.num!
=0)
str+=getTop(&
ss);
pop(&
for(i=str.length()-1;
i>
=0;
i--)
cout<
<
str.at(i);
voidpredict(Stackstack,stringinput)//预测分析总函数
{
inta=1;
charb;
charctop;
//当前栈顶符号
charcinput;
//当前输入符号
inti=0,j=0,count=0;
interror=0;
cout<
"
步骤"
<
'
\t'
栈"
输入缓冲区"
所用的产生式"
endl;
count++<
displayStack(&
stack);
input<
while(getTop(&
stack)!
='
)
stringproduce="
ctop=getTop(&
cinput=input.at(i);
if(isT(ctop))//栈顶符号为终结符
if(ctop==cinput)
{
pop(&
i++;
}
else
{
error=1;
produce+="
\"
produce+=ctop;
匹配"
else//栈顶符号位非终结符
stringstr=isInPred(ctop,cinput);
if(str!
if(str!
{
for(j=str.length()-1;
j>
j--)
push(&
stack,str.at(j));
}
produce+=ctop;
produce+="
→"
produce+=str;
}//栈顶符号位非终结符
displayStack(&
cout<
input.substr(i)<
\t\t"
produce<
if(error)
不接受"
接受"
voidmain()
while
(1){
intsel;
//继续或者退出程序选择
stringinput;
//输入串
inti=0,j=0;
Stackstack;
init(&
push(&
stack,'
);
----------------文法如下--------------"
E→E+T|T"
T→T*F|F"
F→i|(E)"
----------------请输入表达式(以#结尾)--------------"
cin>
>
input;
“R表示“E'
”,”M“表示“T'
”,”@“表示“空”"
predict(stack,input);
sel=0;
if(sel==0)
exit(0);
else
system("
cls"
六、实验小结和思考
本次实验的文法是写在程序中的,不可以自行输入,难度不是很难,并没有太大问题,只是一些未初始化的小问题。
以后要积极做实验,做的程序要更加灵活。