TEST语言语法分析词法分析实验报告.docx

上传人:b****8 文档编号:9885064 上传时间:2023-05-21 格式:DOCX 页数:36 大小:122.50KB
下载 相关 举报
TEST语言语法分析词法分析实验报告.docx_第1页
第1页 / 共36页
TEST语言语法分析词法分析实验报告.docx_第2页
第2页 / 共36页
TEST语言语法分析词法分析实验报告.docx_第3页
第3页 / 共36页
TEST语言语法分析词法分析实验报告.docx_第4页
第4页 / 共36页
TEST语言语法分析词法分析实验报告.docx_第5页
第5页 / 共36页
TEST语言语法分析词法分析实验报告.docx_第6页
第6页 / 共36页
TEST语言语法分析词法分析实验报告.docx_第7页
第7页 / 共36页
TEST语言语法分析词法分析实验报告.docx_第8页
第8页 / 共36页
TEST语言语法分析词法分析实验报告.docx_第9页
第9页 / 共36页
TEST语言语法分析词法分析实验报告.docx_第10页
第10页 / 共36页
TEST语言语法分析词法分析实验报告.docx_第11页
第11页 / 共36页
TEST语言语法分析词法分析实验报告.docx_第12页
第12页 / 共36页
TEST语言语法分析词法分析实验报告.docx_第13页
第13页 / 共36页
TEST语言语法分析词法分析实验报告.docx_第14页
第14页 / 共36页
TEST语言语法分析词法分析实验报告.docx_第15页
第15页 / 共36页
TEST语言语法分析词法分析实验报告.docx_第16页
第16页 / 共36页
TEST语言语法分析词法分析实验报告.docx_第17页
第17页 / 共36页
TEST语言语法分析词法分析实验报告.docx_第18页
第18页 / 共36页
TEST语言语法分析词法分析实验报告.docx_第19页
第19页 / 共36页
TEST语言语法分析词法分析实验报告.docx_第20页
第20页 / 共36页
亲,该文档总共36页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

TEST语言语法分析词法分析实验报告.docx

《TEST语言语法分析词法分析实验报告.docx》由会员分享,可在线阅读,更多相关《TEST语言语法分析词法分析实验报告.docx(36页珍藏版)》请在冰点文库上搜索。

TEST语言语法分析词法分析实验报告.docx

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:

:

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);

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([else]

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;

}

//<表达式>:

:

=<标识符>=<布尔表达式>|<布尔表达式>

//:

:

=ID

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

当前位置:首页 > 初中教育 > 语文

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

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