TEST语言语法分析词法分析实验报告.docx
- 文档编号:26093487
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:36
- 大小:123.52KB
TEST语言语法分析词法分析实验报告.docx
《TEST语言语法分析词法分析实验报告.docx》由会员分享,可在线阅读,更多相关《TEST语言语法分析词法分析实验报告.docx(36页珍藏版)》请在冰豆网上搜索。
TEST语言语法分析词法分析实验报告
编译原理实验报告
实验名称:
分析调试语义分析程序
TEST抽象机模拟器完整程序
保证能用!
!
!
!
!
一、实验目的
通过分析调试TEST语言的语义分析和中间代码生成程序,加深对语法制导翻译思想的理解,掌握将语法分析所识别的语法畴变换为中间代码的语义翻译方法。
二、实验设计
程序流程图
语法分析
程序代码:
Main.cpp
#include
#include
externboolTESTparse(char*pFileName);
externintTESTScan(FILE*fin,FILE*fout);
FILE*fin,*fout;//用于指定输入输出文件的指针
intmain()
{
charszFinName[300];
charszFoutName[300];
printf("请输入源程序文件名(包括路径):
");
scanf("%s",szFinName);
printf("请输入词法分析输出文件名(包括路径):
");
scanf("%s",szFoutName);
if((fin=fopen(szFinName,"r"))==NULL)
{
printf("\n打开词法分析输入文件出错!
\n");
return0;
}
if((fout=fopen(szFoutName,"w"))==NULL)
{
printf("\n创建词法分析输出文件出错!
\n");
return0;
}
intes=TESTScan(fin,fout);
fclose(fin);
fclose(fout);
if(es>0)
printf("词法分析有错,编译停止!
共有%d个错误!
\n",es);
elseif(es==0)
{
printf("词法分析成功!
\n");
intes=0;
es=TESTparse(szFoutName);//调语法分析
if(es==true)printf("语法分析成功!
\n");
elseprintf("语法分析错误!
\n");
}
else
printf("词法分析出现未知错误!
\n");
}
Parse.cpp
#include
#include
#include
#include
#include
//function
boolTESTparse();
boolcompound_Stat();
boolprogram();
boolstatement();
boolexpression_stat();
boolexpression();
boolbool_expr();
booladditive_expr();
boolterm();
boolfactor();
boolif_stat();
boolwhile_stat();
boolfor_stat();
boolwrite_stat();
boolread_stat();
booldeclaration_stat();
booldeclaration_list();
boolstatement_list();
boolcompound_stat();
chartoken[20],token1[40];//token保存单词符号,token1保存单词值
FILE*fp;//用于指向输入文件的指针
intEsLine=0;
typedefstruct
{
intes;
intline;
}EsInf;
std:
:
vector
//语法分析程序
voidProcessError(intes)
{
EsInftemp;
temp.es=es;
temp.line=EsLine;
StackEs.push_back(temp);
}
boolReadFile(char*tok,char*tok1)
{
if(feof(fp))
returnfalse;
fscanf(fp,"%s\t%s\n",tok,tok1);
printf("%s\t%s\n",tok,tok1);
EsLine++;
returntrue;
}
boolTESTparse(char*pFileName)
{
booles=true;
if((fp=fopen(pFileName,"r"))==NULL)
{
printf("\n打开%s错误!
\n",pFileName);
returnfalse;
}
else
program();
if(!
feof(fp))
ProcessError(9);
fclose(fp);
printf("=====语法分析结果!
=====\n");
if(StackEs.size()==0)
{
printf("语法分析成功!
\n");
returntrue;
}
else
{
inti;
for(i=0;i { printf("在第%d行",StackEs[i].line); switch(StackEs[i].es) { case1: printf("缺少{! \n");break; case2: printf("缺少}! \n");break; case3: printf("缺少标识符! \n");break; case4: printf("缺少分号! \n");break; case5: printf("缺少(! \n");break; case6: printf("缺少)! \n");break; case7: printf("缺少操作数! \n");break; case8: printf("文件为空! \n");break; case9: printf("文件尾有多余字符! \n");break; case10: printf("\n打开%s错误! \n",pFileName);break; } } returnfalse; } } //《程序》: : ={<声明序列><语句序列>} //program: : ={ boolprogram() { booles=true; if(ReadFile(token,token1)==false) { ProcessError(8);//文件结束 returnfalse; } if(strcmp(token,"{"))//判断是否为‘{’ ProcessError (1); if(ReadFile(token,token1)==false)//文件中仅有{ ProcessError (2); es=declaration_list(); if(es==false) returnfalse; es=statement_list(); if(es==false) returnfalse; if(strcmp(token,"}"))//判断是否为‘}’ ProcessError (2); returntrue; } //<声明序列>: : =<声明序列><声明语句>|<声明语句> // : = // //改成 : ={ booldeclaration_list() { booles=true; while(strcmp(token,"int")==0) { es=declaration_stat(); if(es==false) returnfalse; } returnes; } //<声明语句>: : =int<变量>; // : =intID; booldeclaration_stat() { booles=true; if(ReadFile(token,token1)==false) { ProcessError (2);//缺少} returnfalse;//文件结束 } if(strcmp(token,"ID")) ProcessError(3);//不是标识符 if(ReadFile(token,token1)==false) { ProcessError (2);//缺少} returnfalse;//文件结束 } if(strcmp(token,";")) ProcessError(4); if(ReadFile(token,token1)==false) { ProcessError (2);//缺少} returnfalse;//文件结束 } return(es); } //<语句序列>: : =<语句序列><语句>|ε // : = //改成 : ={ boolstatement_list() { booles=true; if(feof(fp)) returnfalse; while(strcmp(token,"}")) { es=statement(); if(es==false) return(es); } return(es); } //<语句>: : = //| // : = //| boolstatement() { booles=true; if(strcmp(token,"if")==0) es=if_stat();// elseif(strcmp(token,"while")==0) es=while_stat();// elseif(strcmp(token,"for")==0) es=for_stat();// elseif(strcmp(token,"read")==0) es=read_stat();// elseif(strcmp(token,"write")==0) es=write_stat();// elseif(strcmp(token,"{")==0) es=compound_stat();//<复合语句> elseif(strcmp(token,"ID")==0||strcmp(token,"NUM")==0||strcmp(token,"(")==0) es=expression_stat();//<表达式语句> return(es); } // : =if(<表达式>)<语句>[else<语句>] // : =if( boolif_stat() { booles=true;//if if(ReadFile(token,token1)==false) { ProcessError (2);//缺少} returnfalse;//文件结束 } if(strcmp(token,"(")) ProcessError(5);//少左括号 if(ReadFile(token,token1)==false) { ProcessError (2);//缺少} returnfalse;//文件结束 } es=expression(); if(es==false) return(es); if(strcmp(token,")")) ProcessError(6);//少右括号 if(ReadFile(token,token1)==false) { ProcessError (2);//缺少} returnfalse;//文件结束 } es=statement(); if(es==false) return(es); if(strcmp(token,"else")==0)//else部分处理 { if(ReadFile(token,token1)==false) { ProcessError (2);//缺少} returnfalse;//文件结束 } es=statement(); if(es==false) return(es); } return(es); } // : =while(<表达式>)<语句> // : =while boolwhile_stat() { booles=true; if(ReadFile(token,token1)==false) { ProcessError (2);//缺少} returnfalse;//文件结束 } if(strcmp(token,"(")) ProcessError(5);//少左括号 if(ReadFile(token,token1)==false) { ProcessError (2);//缺少} returnfalse;//文件结束 } es=expression(); if(es==false) return(es); if(strcmp(token,")")) ProcessError(6);//少右括号 if(ReadFile(token,token1)==false) { ProcessError (2);//缺少} returnfalse;//文件结束 } es=statement(); if(es==false) returnes; return(es); } // : =for(<表达式>;<表达式>;<表达式>)<语句> // : =for( boolfor_stat() { booles=true; if(ReadFile(token,token1)==false) { ProcessError (2);//缺少} returnfalse;//文件结束 } if(strcmp(token,"("))ProcessError(5);//少左括号 if(ReadFile(token,token1)==false) { ProcessError (2);//缺少} returnfalse;//文件结束 } es=expression(); if(es==false)return(es); if(strcmp(token,";"))ProcessError(4);//少分号 if(ReadFile(token,token1)==false) { ProcessError (2);//缺少} returnfalse;//文件结束 } es=expression(); if(es==false)return(es); if(strcmp(token,";"))ProcessError(4);//少分号 if(ReadFile(token,token1)==false) { ProcessError (2);//缺少} returnfalse;//文件结束 } es=expression(); if(es==false)return(es); if(strcmp(token,")"))ProcessError(6);//少右括号 if(ReadFile(token,token1)==false) { ProcessError (2);//缺少} returnfalse;//文件结束 } es=statement(); if(es==false)return(es); returnes; } // : =write<表达式>; // : =write boolwrite_stat() { booles=true; if(ReadFile(token,token1)==false) { ProcessError (2);//缺少} returnfalse;//文件结束 } es=expression(); if(es==false)return(es); if(strcmp(token,";"))ProcessError(4);//少分号 if(ReadFile(token,token1)==false) { ProcessError (2);//缺少} returnfalse;//文件结束 } returnes; } // : =read<变量> // : =readId; boolread_stat() { booles=true; if(ReadFile(token,token1)==false) { ProcessError (2);//缺少} returnfalse;//文件结束 } if(strcmp(token,"ID"))ProcessError(3);//少标识符 if(strcmp(token,";"))ProcessError(4);//少分号 if(ReadFile(token,token1)==false) { ProcessError (2);//缺少} returnfalse;//文件结束 } returnes; } //<复合语句>: : {<语句序列>} // : ={ boolcompound_stat()//复合语句函数 { booles=true; if(ReadFile(token,token1)==false) { ProcessError (2);//缺少} returnfalse;//文件结束 } es=statement_list(); if(es==false) returnes; //--------------new---------- if(strcmp(token1,"}")! =0) ProcessError (2); else { if(ReadFile(token,token1)==false) { ProcessError (2);//缺少} returnfalse;//文件结束 } } //---------------new---------- returnes; } //<表达式语句>: : =<<表达式>;|; // : = boolexpression_stat() { booles=true; if(strcmp(token,";")==0) { if(ReadFile(token,token1)==false) { ProcessError (2);//缺少} returnfalse;//文件结束 } returnes; } es=expression(); if(es==false)returnes; if(strcmp(token,";")==0) { if(ReadFile(token,token1)==false) { ProcessError (2);//缺少} returnfalse;//文件结束 } returnes; } else { ProcessError(4);//少分号 } returnes; } //<表达式>: : =<标识符>=<布尔表达式>|<布尔表达式> // : =I
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TEST 语言 语法分析 词法 分析 实验 报告