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