实验五SLR语法分析器Word文档下载推荐.docx

上传人:b****6 文档编号:19117849 上传时间:2023-01-03 格式:DOCX 页数:16 大小:69.20KB
下载 相关 举报
实验五SLR语法分析器Word文档下载推荐.docx_第1页
第1页 / 共16页
实验五SLR语法分析器Word文档下载推荐.docx_第2页
第2页 / 共16页
实验五SLR语法分析器Word文档下载推荐.docx_第3页
第3页 / 共16页
实验五SLR语法分析器Word文档下载推荐.docx_第4页
第4页 / 共16页
实验五SLR语法分析器Word文档下载推荐.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

实验五SLR语法分析器Word文档下载推荐.docx

《实验五SLR语法分析器Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《实验五SLR语法分析器Word文档下载推荐.docx(16页珍藏版)》请在冰豆网上搜索。

实验五SLR语法分析器Word文档下载推荐.docx

四、实验结果与数据处理

1文法分析表:

2.程序分析:

实验源程序:

#include<

stdio.h>

stdlib.h>

intAction[12][6]=

{

105,0,0,104,0,0,

0,106,0,0,0,-1,

0,52,107,0,52,52,

0,54,54,0,54,54,

105,0,0,104,0,0,

0,56,56,0,56,56,

0,106,0,0,111,0,

0,51,107,0,51,51,

0,53,53,0,53,53,

0,55,55,0,55,55};

intGoto[12][3]=

{

1,2,3,

0,0,0,

8,2,3,

0,9,3,

0,0,10,

0,0,0

};

charGrammar[20][10]={'

\0'

};

charVT[10],VN[10];

charAVT[6]={'

i'

'

+'

*'

('

)'

#'

charGVN[3]={'

E'

T'

F'

intvnNum,vtNum,stateNum=12;

intVNum[10];

intgrammarNum;

typedefstruct{

char*base;

char*top;

}SymbolStack;

int*base;

int*top;

}StateStack;

StateStackstate;

SymbolStacksymbol;

intScanGrammar()

FILE*fp=fopen("

SLR文法.txt"

"

r"

);

FILE*tp;

charsingleChar,nextChar;

inti=0,j=0,k,count;

while(!

feof(fp))

{

fscanf(fp,"

%c"

&

singleChar);

if(singleChar=='

?

'

{

Grammar[i][j]='

;

break;

}

\n'

i++;

j=0;

continue;

-'

tp=fp;

fscanf(tp,"

nextChar);

if(nextChar=='

>

{

fp=tp;

continue;

}

|'

Grammar[i+1][0]=Grammar[i][0];

j=1;

Grammar[i][j]=singleChar;

if(singleChar>

='

A'

&

singleChar<

Z'

count=0;

while(VN[count]!

=singleChar&

VN[count]!

count++;

if(VN[count]=='

vnNum=count+1;

if(singleChar=='

S'

{

j++;

continue;

}

VN[count]=singleChar;

else

while(VT[count]!

VT[count]!

if(VT[count]=='

VT[count]=singleChar;

vtNum=count+1;

j++;

}

printf("

输入的文法:

\n"

for(k=0;

k<

=i;

k++)

j=0;

while(Grammar[k][j]!

if(j==1)

printf("

->

"

printf("

Grammar[k][j]);

j++;

printf("

count=0;

VT:

while(VT[count]!

%3c"

VT[count]);

count++;

VT[count]='

vtNum=count+1;

\nVN:

while(VN[count]!

VN[count]);

//

\n%d%d\n"

vtNum,vnNum);

fclose(fp);

grammarNum=i+1;

returni;

}

intvNumCount()

inti,j;

for(i=0;

i<

grammarNum;

i++)

j=1;

while(Grammar[i][j]!

VNum[i]=j;

%3d"

VNum[i]);

}

printf("

return0;

}

voidInitStack()

state.base=(int*)malloc(100*sizeof(int));

if(!

state.base)exit

(1);

state.top=state.base;

*state.top=0;

symbol.base=(char*)malloc(100*sizeof(char));

symbol.base)exit

(1);

symbol.top=symbol.base;

*symbol.top='

intJudge(intstateTop,charinputChar)

stateNum;

if(stateTop==i)break;

for(j=0;

j<

vtNum;

j++)

if(inputChar==AVT[j])break;

returnAction[i][j];

intGetGoto(intstateTop,charinputChar)

vnNum;

if(inputChar==GVN[j])break;

returnGoto[i][j];

intprint(intcount,inti,charInput[],intaction,intgt,intsign)

int*p=state.base,stateNum;

intj,jj;

char*q=symbol.base,symbolNum;

%d\t"

count);

while(p!

=state.top+1)

stateNum=*p;

%d"

stateNum);

p++;

\t"

while(q!

=symbol.top+1)

symbolNum=*q;

symbolNum);

q++;

j=i;

jj=0;

while(jj<

j)

"

jj++;

}

while(Input[j]!

Input[j]);

j++;

if(sign==1)

\tS%d\t%d\n"

action,gt);

if(sign==2)

\tr%d\t%d\n"

if(sign==3)

\tacc\t%d\n"

gt);

if(sign==0)printf("

\t0\t0\n"

intPop(intaction)

int*p,stateNum,ssValue,i;

state.top--;

p=state.top;

stateNum=*p;

i=VNum[action]-1;

while(i!

=0)

symbol.top--;

i--;

symbol.top++;

*symbol.top=Grammar[action][0];

ssValue=GetGoto(stateNum,Grammar[action][0]);

if(ssValue==0)returnssValue;

state.top++;

*state.top=ssValue;

returnssValue;

intReduction()

charInput[20];

inti=0,count=1;

intssValue,action;

intstateTop,gt;

intsign=-1;

//移进1,规约2,接受3

scanf("

%s"

Input);

while(Input[i]!

if(Input[i]>

Input[i]<

输入的不是有效的表达式!

return0;

i++;

i=0;

步骤\t状态栈\t符号栈\t输入串\t\tACTION\tGOTO\n"

if(count==1)

print(count,i,Input,0,0,0);

stateTop=*state.top;

ssValue=Judge(stateTop,Input[i]);

if(ssValue==0)

state.top--;

if(*symbol.top=='

规约出错!

return0;

continue;

if(ssValue==-1)

sign=3;

print(count,i,Input,ssValue,0,sign);

return1;

if(ssValue>

=100)

sign=1;

action=ssValue-100;

state.top++;

*state.top=action;

symbol.top++;

*symbol.top=Input[i];

i++;

print(count,i,Input,action,0,sign);

=50&

ssValue<

100)

{sign=2;

action=ssValue-50;

gt=Pop(action);

print(count,i,Input,action,gt,sign);

count++;

intmain()

ScanGrammar();

vNumCount();

InitStack();

Reduction();

五、分析与讨论

通过此次试验我学会了:

掌握非递归预测分析的编程方法。

成绩

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

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1