TEST语言语法分析词法分析实验报告Word文档下载推荐.docx

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

TEST语言语法分析词法分析实验报告Word文档下载推荐.docx

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

TEST语言语法分析词法分析实验报告Word文档下载推荐.docx

共有%d个错误!

n,es);

elseif(es=0)printf(词法分析成功!

intes=0;

es=TESTparse(szFoutName);

/调语法分析if(es=true)printf(语法分析成功!

elseprintf(语法分析错误!

elseprintf(词法分析出现未知错误!

Parse.cpp#include#include#include#include#include/functionboolTESTparse();

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

chartoken20,token140;

/token保存单词符号,token1保存单词值FILE*fp;

/用于指向输入文件的指针intEsLine=0;

typedefstructintes;

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,%st%sn,tok,tok1);

printf(%st%sn,tok,tok1);

EsLine+;

returntrue;

boolTESTparse(char*pFileName)booles=true;

if(fp=fopen(pFileName,r)=NULL)printf(n打开%s错误!

n,pFileName);

returnfalse;

elseprogram();

if(!

feof(fp)ProcessError(9);

fclose(fp);

printf(=语法分析结果!

=n);

if(StackEs.size()=0)printf(语法分析成功!

elseinti;

for(i=0;

iStackEs.size();

i+)printf(在第%d行,StackEsi.line);

switch(StackEsi.es)case1:

printf(缺少!

break;

case2:

case3:

printf(缺少标识符!

case4:

printf(缺少分号!

case5:

printf(缺少(!

case6:

printf(缺少)!

case7:

printf(缺少操作数!

case8:

printf(文件为空!

case9:

printf(文件尾有多余字符!

case10:

printf(n打开%s错误!

/程序:

=/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(strcmp(token,)/判断是否为ProcessError

(2);

/:

=|/:

=/|/改成:

=booldeclaration_list()booles=true;

while(strcmp(token,int)=0)es=declaration_stat();

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

/文件结束if(strcmp(token,;

)ProcessError(4);

/文件结束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()elseboolif_stat()booles=true;

/ifif(ReadFile(token,token1)=false)ProcessError

(2);

/文件结束if(strcmp(token,()ProcessError(5);

/少左括号if(ReadFile(token,token1)=false)ProcessError

(2);

/文件结束es=expression();

if(strcmp(token,)ProcessError(6);

/少右括号if(ReadFile(token,token1)=false)ProcessError

(2);

/文件结束es=statement();

if(strcmp(token,else)=0)/else部分处理if(ReadFile(token,token1)=false)ProcessError

(2);

=while()/:

=whileboolwhile_stat()booles=true;

if(es=false)returnes;

=for(;

;

)/:

=for(;

)boolfor_stat()booles=true;

if(strcmp(token,;

/少分号if(ReadFile(token,token1)=false)ProcessError

(2);

=write;

=writeboolwrite_stat()booles=true;

/文件结束returnes;

=read/:

=readId;

boolread_stat()booles=true;

/少标识符if(strcmp(token,;

=boolcompound_stat()/复合语句函数booles=true;

/文件结束es=statement_list();

/-new-if(strcmp(token1,)!

=0)ProcessError

(2);

elseif(ReadFile(token,token1)=false)ProcessError

(2);

/文件结束/-new-returnes;

=;

|;

=;

boolexpression_stat()booles=true;

)=0)if(ReadFile(token,token1)=false)ProcessError

(2);

es=expression();

elseProcessError(4);

/少分号returnes;

=ID=|boolexpression()booles=true;

intfileadd;

chartoken220,token340;

if(strcmp(token,ID)=0)fileadd=ftell(fp);

/记住当前文件位置if(ReadFile(token2,token3)=false)ProcessError

(2);

/文件结束if(strcmp(token2,=)=0)/=if(ReadFile(token,token1)=false)ProcessError

(2);

/文件结束es=bool_expr();

elsefseek(fp,fileadd,0);

/若非=,则文件指针回到=前的标识符EsLine-;

es=bool_expr();

elsees=bool_expr();

=(|=|=|=|!

=)/:

=)boolbool_expr()booles=true;

es=additive_expr();

if(strcmp(token,)=0|strcmp(token,=)=0|strcmp(token,)=0|strcmp(token,=)=0|strcmp(token,!

=)=0|strcmp(token,=)=0)if(ReadFile(token,token1)=false)ProcessError

(2);

/文件结束es=additive_expr();

=(+|-)/:

=(+|-)booladditive_expr()booles=true;

es=term();

while(strcmp(token,+)=0|strcmp(token,-)=0)if(ReadFile(token,token1)=false)ProcessError

(2);

/文件结束es=term();

=(*|/)/:

=(*|/)boolterm()booles=true;

es=factor();

while(strcmp(token,*)=0|strcmp(token,/)=0)if(ReadFile(token,token1)=false)ProcessError

(2);

/文件结束es=factor();

=()|/:

=()|ID|NUMboolfactor()booles=true;

if(strcmp(token,()=0)if(ReadFile(token,token1)=false)ProcessError

(2);

/文件结束elseif(strcmp(token,ID)=0|strcmp(token,NUM)=0)if(ReadFile(token,token1)=false)ProcessError

(2);

elseProcessError(7);

/缺少操作数returnes;

Scan.cpp#include#include#include/保留字#defineKEYWORDNUM8char*pKeywordKEYWORDNUM=if,else,for,while,do,int,read,write;

/单分界符charszSingleWord50=+-();

:

/双分界符charszDoubleWord10=!

/其他符char*szDivide=/;

char*szStar=*;

char*szEqual=;

#defineSTATUSNUM16/状态个数#defineDATANUM10/数据流个数/数据流类型typedefunsignedintDATA;

#defineOTHER0/wronginput#defineLETTER1/字母#defineDIGIT2/数字#defineSINGLEWORD3/单分界符#defineDOUBLEWORD4/双分界符#defineDIVIDE5/#defineEQUAL6/=#defineSTAR7/*#defineSPACE8/空白#defineFILEOVER9/状态类型typedefunsignedintSTATUS;

#defineNOSTATUS0/wronginput#defineSTART1#defineCASE_ID2#defineEND_ID3#defineCASE_NUM4#defineEND_NUM5#defineCASE_SINGLE6#defineEND_SINGLE7#defineCASE_DOUBLE8#defineCASE_DOUBLE29#defineEND_DOUBLE10#defineCASE_DIVIDE11#defineCASE_NOTE12#defineEND_NOTE13#defineCASE_ERROR14#defineEND_ERROR15/状态转换表/:

到达终结状态的数据不保存在输出串中intreflectSTATUSNUMDATANUM=/OTHERLETTERDIGITSINGLEWORDDOUBLEWORDDIVIDEEQUALSTARSPACEFILEOVER/*NOSTATUS*/NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,/*START*/CASE_ERROR,CASE_ID,CASE_NUM,CASE_SINGLE,CASE_DOUBLE,CASE_DIVIDE,CASE_DOUBLE,CASE_SINGLE,START,START,/*CADE_ID*/END_ID,CASE_ID,CASE_ID,END_ID,END_ID,END_ID,END_ID,END_ID,END_ID,END_ID,/*END_ID*/NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,/*CASE_NUM*/END_NUM,END_NUM,CASE_NUM,END_NUM,END_NUM,END_NUM,END_NUM,END_NUM,END_NUM,END_NUM,/*END_NUM*/NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,NOSTATUS,/*CASE_SINGLE*/END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,END_SINGLE,/*END_SINGLE*/NOSTATUS,NOSTATUS,NOSTATUS,

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

当前位置:首页 > 工程科技 > 兵器核科学

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

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