自下而上分析.docx
- 文档编号:26353758
- 上传时间:2023-06-18
- 格式:DOCX
- 页数:10
- 大小:32.83KB
自下而上分析.docx
《自下而上分析.docx》由会员分享,可在线阅读,更多相关《自下而上分析.docx(10页珍藏版)》请在冰豆网上搜索。
自下而上分析
实验二语法分析(自下而上分析)
一、实验目的
设计语法分析器
二、实验要求
1.掌握自下而上分语法分析思想
2.实现语法分析器和词法分析器的连接
3.编写语法分析器的程序
4.调试、运行程序,并结合调试实例进行分析
三、实验内容
1.通过分析栈和分析表实现句型分析,输入符号串从词法分析的结果文件中获取;通过栈顶的状态与当前输入符号匹配确定分析表部分的元素,当是移进动作时,把输入符号与状态推入栈中,当元素是归约动作时,把栈顶中形成的句柄部分按照规则归约;
2.对新栈状态与所归约的非终结符按照转移表部分进行状态转换,把转换成的状态与所归约成非终结符推入栈中。
其中特别注意的是记录分析过程和显示分析过程
本实验程序有以下几个方面;
(1)文法输入
(2)分析结果的输出
四、分析结果
五、源程序实现
#include
#include
#include
structstack
{
stack*top;
charvalue;
};
charpop(stack*pst)
{chare;
if(pst->top==pst)
{
printf("Thestackisnull.");
return0;
}
else
{
e=pst->top->value;
pst->top--;
returne;
}
}
voidpush(stack*pst,chare)
{
pst->top++;
pst->top->value=e;
}
voidprintstack(stack*pst)
{stack*printtemp=pst;
while(printtemp<=(pst->top))
{
printf("%c",printtemp->value);
printtemp++;
}
}
voidprintstring(stack*pst)
{
stack*printtemp=(pst->top);
while(printtemp>=pst)
{
printf("%c",printtemp->value);
printtemp--;
}
}
voidprintSLR(int&number,stack*status,stack*grammar,stack*string)
{
printf("%d",number);
printstack(status);printf("");
printstack(grammar);printf("");
printstring(string);printf("");
number++;
}
intmain()
{
stack*string=(stack*)malloc(40);
string->top=string;
string->top->value='#';
stack*status=(stack*)malloc(40);
status->top=status;
status->top->value='0';
stack*grammar=(stack*)malloc(40);
grammar->top=grammar;
grammar->top->value='#';
FILE*fp;
fp=fopen("c:
\\F.txt","a+");
charfilestring[10][20]={'\0'};
charstr[10]={'\0'};
intstringnumber=0;
intnumber=0;
while(!
feof(fp))
{
fgets(filestring[stringnumber],23,fp);
if(filestring[stringnumber][0]!
='\n')
stringnumber++;
}
for(inti=0;i<=(stringnumber-1);i++)
{
for(intj=strlen(filestring[i])-3;j>=0;j--)
if(filestring[i][j]!
='\n')
push(string,filestring[i][j]);
printf("此次分析的字符串为:
%s\n",filestring[i]);
printf("步骤状态栈符号栈输入串ACTION\n");
printSLR(number,status,grammar,string);
printf("移进\n");
while(string->top->value!
='#')
{
charch=pop(string);
if(ch=='i')
{
push(grammar,ch);
if(status->top->value=='0')
{push(status,'5');
printSLR(number,status,grammar,string);
printf("归约\n");
pop(status);
pop(grammar);
push(status,'3');
push(grammar,'F');
printSLR(number,status,grammar,string);
printf("归约\n");
pop(status);
pop(grammar);
push(status,'2');
push(grammar,'T');
printSLR(number,status,grammar,string);
printf("归约\n");
if(string->top->value=='+'||string->top->value=='-')
{
pop(status);
pop(grammar);
push(status,'1');
push(grammar,'E');
printSLR(number,status,grammar,string);
printf("移进\n");
}
}
elseif(status->top->value=='6')
{
push(status,'5');
printSLR(number,status,grammar,string);
printf("归约\n");
pop(status);
pop(grammar);
push(status,'3');
push(grammar,'F');
printSLR(number,status,grammar,string);
printf("归约\n");
pop(status);
pop(grammar);
push(status,'9');
push(grammar,'T');
printSLR(number,status,grammar,string);
printf("归约\n");
if(string->top->value=='+'||string->top->value=='-')
{
pop(status);
pop(status);
pop(grammar);
pop(grammar);
printSLR(number,status,grammar,string);
printf("移进\n");
}
}
elseif(status->top->value=='7')
{
push(status,'5');
printSLR(number,status,grammar,string);
printf("归约\n");
pop(status);
pop(grammar);
push(status,'(');
push(status,'1');
push(status,'0');
push(status,')');
push(grammar,'F');
printSLR(number,status,grammar,string);
printf("归约\n");
pop(status);
pop(status);
pop(status);
pop(status);
pop(status);
pop(grammar);
pop(grammar);
printSLR(number,status,grammar,string);
printf("移进\n");
if(string->top->value=='+'||string->top->value=='-')
{
pop(status);
pop(grammar);
push(status,'1');
push(grammar,'E');
printSLR(number,status,grammar,string);
printf("移进\n");
}
}
elseprintf("Thereissomethingwrongneari.");
}
elseif(ch=='+'||ch=='-')
{
if(status->top->value=='1'||status->top->value=='8')
push(status,'6');
elseprintf("Thereissomethingwrongnear+or-\n");
push(grammar,ch);
printSLR(number,status,grammar,string);
printf("移进\n");
}
elseif(ch=='*'||ch=='/')
{
push(grammar,ch);
if(status->top->value=='2'||status->top->value=='9')
push(status,'7');
elseprintf("Thereissomethingwrongnear*or/\n");
printSLR(number,status,grammar,string);
printf("移进\n");
}
}
pop(status);
pop(status);
pop(grammar);
pop(grammar);
printSLR(number,status,grammar,string);
printf("acc\n");
number=0;
status->top=status;
grammar->top=grammar;
string->top=string;
printf("SLR
(1)分析结束
\n********************分割线*******************\n");
}
return0;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 自下而上 分析