编译原理预测分析法附源码Word格式文档下载.docx

上传人:wj 文档编号:3962937 上传时间:2023-05-02 格式:DOCX 页数:5 大小:18.26KB
下载 相关 举报
编译原理预测分析法附源码Word格式文档下载.docx_第1页
第1页 / 共5页
编译原理预测分析法附源码Word格式文档下载.docx_第2页
第2页 / 共5页
编译原理预测分析法附源码Word格式文档下载.docx_第3页
第3页 / 共5页
编译原理预测分析法附源码Word格式文档下载.docx_第4页
第4页 / 共5页
编译原理预测分析法附源码Word格式文档下载.docx_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

编译原理预测分析法附源码Word格式文档下载.docx

《编译原理预测分析法附源码Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《编译原理预测分析法附源码Word格式文档下载.docx(5页珍藏版)》请在冰点文库上搜索。

编译原理预测分析法附源码Word格式文档下载.docx

//初始化的栈的大小

//非终结符数组集

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"

六、实验小结和思考

本次实验的文法是写在程序中的,不可以自行输入,难度不是很难,并没有太大问题,只是一些未初始化的小问题。

以后要积极做实验,做的程序要更加灵活。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 金融投资

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2