TEST语言语法分析词法分析实验报告.docx
《TEST语言语法分析词法分析实验报告.docx》由会员分享,可在线阅读,更多相关《TEST语言语法分析词法分析实验报告.docx(36页珍藏版)》请在冰点文库上搜索。
TEST语言语法分析词法分析实验报告
编译原理实验报告
实验名称:
分析调试语义分析程序
TEST抽象机模拟器完整程序
保证能用!
!
一、实验目的
通过分析调试TEST语言的语义分析和中间代码生成程序,加深对语法制导翻译思想的理解,掌握将语法分析所识别的语法范畴变换为中间代码的语义翻译方法。
二、实验设计
程序流程图
语法分析
程序代码:
Main.cpp
#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创建词法分析输出文件出错!
intes=TESTScan(fin,fout);
fclose(fin);
fclose(fout);
if(es>0)
printf("词法分析有错,编译停止!
共有%d个错误!
\n",es);
elseif(es==0)
printf("词法分析成功!
intes=0;
es=TESTparse(szFoutName);//调语法分析
if(es==true)printf("语法分析成功!
elseprintf("语法分析错误!
else
printf("词法分析出现未知错误!
Parse.cpp
//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:
:
vectorStackEs;
//语法分析程序
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);
program();
if(!
feof(fp))
ProcessError(9);
fclose(fp);
printf("=====语法分析结果!
=====\n");
if(StackEs.size()==0)
printf("语法分析成功!
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()[else]boolif_stat(){booles=true;//ifif(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(<表达式>)<语句>//::=whileboolwhile_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<表达式>;//::=writeboolwrite_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;}//<表达式>::=<标识符>=<布尔表达式>|<布尔表达式>//::=ID
printf("在第%d行",StackEs[i].line);
switch(StackEs[i].es)
case1:
printf("缺少{!
\n");break;
case2:
printf("缺少}!
case3:
printf("缺少标识符!
case4:
printf("缺少分号!
case5:
printf("缺少(!
case6:
printf("缺少)!
case7:
printf("缺少操作数!
case8:
printf("文件为空!
case9:
printf("文件尾有多余字符!
case10:
\n",pFileName);break;
//《程序》:
={<声明序列><语句序列>}
//program:
={}
boolprogram()
if(ReadFile(token,token1)==false)
ProcessError(8);//文件结束
if(strcmp(token,"{"))//判断是否为‘{’
ProcessError
(1);
if(ReadFile(token,token1)==false)//文件中仅有{
(2);
es=declaration_list();
if(es==false)
es=statement_list();
if(strcmp(token,"}"))//判断是否为‘}’
//<声明序列>:
=<声明序列><声明语句>|<声明语句>
//:
=
//|ε
//改成:
booldeclaration_list()
while(strcmp(token,"int")==0)
es=declaration_stat();
returnes;
//<声明语句>:
=int<变量>;
=intID;
booldeclaration_stat()
(2);//缺少}
returnfalse;//文件结束
if(strcmp(token,"ID"))
ProcessError(3);//不是标识符
if(strcmp(token,";"))
ProcessError(4);
return(es);
//<语句序列>:
=<语句序列><语句>|ε
=|ε
boolstatement_list()
while(strcmp(token,"}"))
es=statement();
//<语句>:
=|||
//||<复合语句>|<表达式语句>
=||
//||
boolstatement()
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();//<表达式语句>
=if(<表达式>)<语句>[else<语句>]
=if()[else]
boolif_stat()
booles=true;//if
if(strcmp(token,"("))
ProcessError(5);//少左括号
es=expression();
if(strcmp(token,")"))
ProcessError(6);//少右括号
if(strcmp(token,"else")==0)//else部分处理
=while(<表达式>)<语句>
=while
boolwhile_stat()
=for(<表达式>;<表达式>;<表达式>)<语句>
=for(;;)
boolfor_stat()
if(strcmp(token,"("))ProcessError(5);//少左括号
if(es==false)return(es);
if(strcmp(token,";"))ProcessError(4);//少分号
if(strcmp(token,")"))ProcessError(6);//少右括号
=write<表达式>;
=write
boolwrite_stat()
=read<变量>
=readId;
boolread_stat()
if(strcmp(token,"ID"))ProcessError(3);//少标识符
//<复合语句>:
{<语句序列>}
boolcompound_stat()//复合语句函数
//--------------new----------
if(strcmp(token1,"}")!
=0)
//---------------new----------
//<表达式语句>:
=<<表达式>;|;
=;|;
boolexpression_stat()
if(strcmp(token,";")==0)
if(es==false)returnes;
ProcessError(4);//少分号
//<表达式>:
=<标识符>=<布尔表达式>|<布尔表达式>
=ID
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2