编译原理课程设计报告C语言词法与语法分析器的实现doc.docx

上传人:b****6 文档编号:4771404 上传时间:2022-12-08 格式:DOCX 页数:4 大小:17.87KB
下载 相关 举报
编译原理课程设计报告C语言词法与语法分析器的实现doc.docx_第1页
第1页 / 共4页
编译原理课程设计报告C语言词法与语法分析器的实现doc.docx_第2页
第2页 / 共4页
编译原理课程设计报告C语言词法与语法分析器的实现doc.docx_第3页
第3页 / 共4页
编译原理课程设计报告C语言词法与语法分析器的实现doc.docx_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

编译原理课程设计报告C语言词法与语法分析器的实现doc.docx

《编译原理课程设计报告C语言词法与语法分析器的实现doc.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计报告C语言词法与语法分析器的实现doc.docx(4页珍藏版)》请在冰豆网上搜索。

编译原理课程设计报告C语言词法与语法分析器的实现doc.docx

编译原理课程设计报告C语言词法与语法分析器的实现doc

编译原理课程设计报告C语言词法与语法分析器的实现

编译原理课程设计报告课题名称编译原理课程设计C-语言词法与语法分析器的实现提交文档学生姓名提交文档学生学号同组成员名单指导教师姓名指导教师评阅成绩指导教师评阅意见..提交报告时间年月日C-词法与语法分析器的实现1.课程设计目标

(1)题目实用性C-语言拥有一个完整语言的基本属性,通过编写C-语言的词法分析和语法分析,对于理解编译原理的相关理论和知识有很大的作用。

通过编写C-语言词法和语法分析程序,能够对编译原理的相关知识正则表达式、有限自动机、语法分析等有一个比较清晰的了解和掌握。

(2)C-语言的词法说明①语言的关键字elseifintreturnvoidwhile所有的关键字都是保留字,并且必须是小写。

②专用符号-*/;,[]{}/**/③其他标记是ID和NUM,通过下列正则表达式定义IDletterletter*NUMdigitdigit*lettera|..|z|A|..|Zdigit0|..|9注ID表示标识符,NUM表示数字,letter表示一个字母,digit表示一个数字。

小写和大写字母是有区别的。

④空格由空白、换行符和制表符组成。

空格通常被忽略。

⑤注释用通常的c语言符号/*...*/围起来。

注释可以放在任何空白出现的位置即注释不能放在标记内上,且可以超过一行。

注释不能嵌套。

(3)程序设计目标能够对一个程序正确的进行词法及语法分析。

2.分析与设计

(1)设计思想a.词法分析词法分析的实现主要利用有穷自动机理论。

有穷自动机可用作描述在输入串中识别模式的过程,因此也能用作构造扫描程序。

通过有穷自动机理论能够容易的设计出词法分析器。

b.语法分析语法分析采用递归下降分析。

递归下降法是语法分析中最易懂的一种方法。

它的主要原理是,对每个非终结符按其产生式结构构造相应语法分析子程序,其中终结符产生匹配命令,而非终结符则产生过程调用命令。

因为文法递归相应子程序也递归,所以称这种方法为递归子程序下降法或递归下降法。

其中子程序的结构与产生式结构几乎是一致的。

(2)程序流程图程序主流程图词法分析语法分析读取程序读取程序进行递归下降分析匹配或建立树对输入的字符进行匹配判断对应输出各行代码的词法分析结果输出程序对应的语法树词法分析子流程图Start否是Num是否为dight是否为num否否是ID是否为alpha是否为id否是是否为是否为,“;fprintflisting,”Syntaxerroratlineds“,lineno,message;ErrorTRUE;}/*判断读取的字符*/staticvoidmatchTokenTypeexpected{iftokenexpected{tokengetToken;}else{syntaxError“unexpectedtoken-“;printTokentoken,tokenString;fprintflisting,““;}}/*进行语法分析,构建语法树*/TreeNode*declaration_listvoid{TreeNode*tdeclaration;TreeNode*pt;whiletokenINT||tokenVOID{TreeNode*qdeclaration;ifqNULL{iftNULLtpq;else/*nowpcannotbeNULLeither*/{p-siblingq;pq;}}}returnt;}TreeNode*declarationvoid{TreeNode*tNULL;switchtoken{caseVOIDcaseINTtnewStmtNodeDecK;iftokenINTt-typeInteger;elset-typeVoid;matchtoken;switchtoken{caseIDt-attr.namecopyStringtokenString;t-kind.stmtVarDK;matchID;switchtoken{caseLZKHt-kind.stmtVarDK;t-typeIntArray;matchLZKH;matchNUM;matchRZKH;matchSEMI;break;caseLPARENt-kind.stmtFunDK;matchLPAREN;t-child[0]params;matchRPAREN;t-child[1]compound_stmt;break;defaultmatchSEMI;break;}break;defaultsyntaxError“unexpectedtoken-“;printTokentoken,tokenString;tokengetToken;break;}break;defaultsyntaxError“unexpectedtoken-“;printTokentoken,tokenString;tokengetToken;break;}/*endcase*/returnt;}TreeNode*paramsvoid{TreeNode*tNULL;iftokenVOID{matchtoken;tnewStmtNodeParamList;t-child[0]newStmtNodeParamK;t-child[0]-typeVoid;}elseiftokenRPARENtNULL;else{tparam_list;}returnt;}TreeNode*param_listvoid{TreeNode*tnewStmtNodeParamList;inti1;t-child[0]param;whiletokenRPAREN{matchDOT;t-child[i]param;i;}returnt;}TreeNode*paramvoid{TreeNode*tNULL;matchINT;tnewStmtNodeParamK;t-typeInteger;t-attr.namecopyStringtokenString;matchID;iftokenLZKH{t-typeIntArray;matchLZKH;matchRZKH;}returnt;}TreeNode*compound_stmtvoid{TreeNode*tnewStmtNodeComK;matchLDKH;t-child[0]local_declarations;t-child[1]statement_list;matchRDKH;returnt;}TreeNode*local_declarationsvoid{TreeNode*tnewStmtNodeLocalDecK;inti0;whiletokenINT||tokenVOID{t-child[i]declaration;i;}returnt;}TreeNode*statement_listvoid{TreeNode*tnewStmtNodeStmtList;inti0;whiletokenRDKH{t-child[i]statement;i;}returnt;}TreeNode*statementvoid{TreeNode*t;switchtoken{caseIFtif_stmt;break;caseWHILEtwhile_stmt;break;caseIDcaseSEMItexpression_stmt;break;caseRETURNtreturn_stmt;break;caseLDKHtcompound_stmt;break;defaultsyntaxError“unexpectedtoken-“;printTokentoken,tokenString;tokengetToken;break;}/*endcase*/returnt;}TreeNode*expression_stmtvoid{TreeNode*tnewStmtNodeExpstmtK;iftokenSEMImatchSEMI;else{texpression;matchSEMI;}returnt;}TreeNode*if_stmtvoid{TreeNode*tnewStmtNodeIfK;iftNULL{matchIF;matchLPAREN;t-child[0]expression;matchRPAREN;t-child[1]statement;iftokenELSE{matchELSE;iftNULLt-child[2]newStmtNodeElseK;t-child[2]-child[0]statement;}}returnt;}TreeNode*while_stmtvoid{TreeNode*tnewStmtNodeWhileK;matchWHILE;matchLPAREN;iftNULLt-child[0]expression;matchRPAREN;iftNULLt-child[1]statement;returnt;}TreeNode*return_stmtvoid{TreeNode*tnewStmtNodeRetK;iftokenRETURNmatchRETURN;iftokenSEMImatchSEMI;else{t-child[0]expression;matchSEMI;}returnt;}TreeNode*expressionvoid{TreeNode*tsimple_exp;returnt;}TreeNode*varvoid{TreeNode*tnewExpNodeIdK;iftNULLmatchID;iftokenLZKH{matchtoken;t-typeArrayUnit;t-child[0]expression;matchRZKH;}returnt;}TreeNode*simple_expvoid{TreeNode*tadditive_expression;iftNULL{iftokenLT||tokenLE||tokenMT||tokenME||tokenEQ||tokenNEQ{TreeNode*pnewExpNodeOpK;ifpNULL{p-attr.optoken;p-child[0]t;matchtoken;p-child[1]additive_expression;tp;}}}returnt;}TreeNode*additive_expressionvoid{TreeNode*tterm;whiletokenPLUS||tokenMINUS{TreeNode*pnewExpNodeOpK;p-attr.optoken;p-child[0]t;matchtoken;p-child[1]term;tp;}returnt;}TreeNode*termvoid{TreeNode*tfactor;whiletokenTIMES||tokenOVER{TreeNode*pnewExpNodeOpK;ifpNULL{p-child[0]t;p-attr.optoken;matchtoken;p-child[1]factor;tp;}}returnt;}TreeNode*factorvoid{TreeNode*tNULL;switchtoken{caseNUMtnewExpNodeConstK;iftNULLmatchNUM;break;caseIDtvar;iftokenASSIGN{TreeNode*pnewStmtNodeAssignK;p-attr.namet-attr.name;matchtoken;p-child[0]expression;tp;}iftokenLPAREN{TreeNode*pnewStmtNodeCallK;p-attr.namet-attr.name;tp;matchtoken;p-child[0]args;matchRPAREN;}break;caseLPARENmatchLPAREN;texpression;matchRPAREN;break;defaultsyntaxError“unexpectedtoken-“;printTokentoken,tokenString;tokengetToken;break;}returnt;}TreeNode*argsvoid{TreeNode*tnewStmtNodeArgList;iftokenRPAREN{t-child[0]arg_list;returnt;}elsereturnNULL;}TreeNode*arg_listvoid{TreeNode*tnewStmtNodeArgK;inti1;iftokenRPARENt-child[0]expression;whiletokenRPAREN{matchDOT;t-child[i]expression;i;}returnt;}TreeNode*parsevoid{TreeNode*t;tokengetToken;tdeclaration_list;iftokenENDFILEsyntaxError“Codeendsbeforefile\n“;returnt;}scan.cppinclude“globals.h“include“util.h“include“scan.h“/*对扫描的字符进行匹配判断*/TokenTypegetTokenvoid{/*indexforstoringintotokenString*/inttokenStringIndex0;/*holdscurrenttokentobereturned*/TokenTypecurrentToken;/*currentstate-alwaysbeginsatSTART*/StateTypestateSTART;/*flagtoindicatesavetotokenString*/intsave;whilestateDONE{intcgetNextChar;saveTRUE;switchstate{caseSTARTifisdigitcstateINNUM;elseifisalphacstateINID;elseifcstateINEQUAL;elseifcstateINME;elseifc||c\t||c\nsaveFALSE;elseifcstateINNEQ;elseifc/{ifgetNextChar*{ungetNextChar;stateDONE;currentTokenOVER;break;}else{saveFALSE;stateINCOMMENT;}}else{stateDONE;switchc{caseEOFsaveFALSE;currentTokenENDFILE;break;casecurrentTokenPLUS;break;case-currentTokenMINUS;break;case*currentTokenTIMES;break;casecurrentTokenLPAREN;break;casecurrentTokenRPAREN;break;case;currentTokenSEMI;break;case[currentTokenLZKH;break;case]currentTokenRZKH;break;case{currentTokenLDKH;break;case}currentTokenRDKH;break;case,currentTokenDOT;break;defaultcurrentTokenERROR;break;}}break;caseINCOMMENTsaveFALSE;ifcEOF{stateDONE;currentTokenERROR;}elseifc*{ifgetNextChar/{stateSTART;}else{ungetNextChar;}}break;caseINNEQstateDONE;ifccurrentTokenNEQ;else{ungetNextChar;saveFALSE;currentTokenERROR;}break;caseINEQUALstateDONE;ifccurrentTokenEQ;else{/*backupintheinput*/ungetNextChar;currentTokenASSIGN;}break;caseINNUMifisdigitc{/*backupintheinput*/ungetNextChar;saveFALSE;stateDONE;currentTokenNUM;}break;caseINIDifisalphac{/*backupintheinput*/ungetNextChar;saveFALSE;stateDONE;currentTokenID;}break;caseINLEstateDONE;ifccurrentTokenLE;else{/*backupintheinput*/ungetNextChar;currentTokenLT;}break;caseINMEstateDONE;ifccurrentTokenME;else{/*backupintheinput*/ungetNextChar;currentTokenMT;}break;caseDONEdefault/*shouldneverhappen*/fprintflisting,“ScannerBugstated\n“,state;stateDONE;currentTokenERROR;break;}ifsavebreak;caseNEQfprintflisting,“\n“;break;caseASSIGNfprintflisting,“\n“;break;caseDOTfprintflisting,“,\n“;break;caseLZKHfprintflisting,“[\n“;break;caseRZKHfprintflisting,“]\n“;break;caseLDKHfprintflisting,“{\n“;break;caseRDKHfprintflisting,“}\n“;break;caseLZSfprintflisting,“/*\n“;break;caseRZSfprintflisting,“*/\n“;break;caseMEfprintflisting,“\n“;break;caseLEfprintflisting,“child[i]NULL;}t-siblingNULL;t-nodekindStmtK;t-kind.stmtkind;t-linenolineno;}returnt;}/*FunctionnewExpNodecreatesanewexpressionnodeforsyntaxtreeconstruction*/TreeNode*newExpNodeExpKindkind{TreeNode*tTreeNode*mallocsizeofTreeNode;inti;iftNULL{fprintflisting,“Outofmemoryerroratlined\n“,lineno;}else{fori0;ichild[i]NULL;}t-siblingNULL;t-nodekindExpK;t-kind.expkind;t-linenolineno;t-typeVoid;}returnt;}char*copyStringchar*s{intn;char*t;ifsNULL{returnNULL;}nstrlens1;tchar*mallocn;/*其作用是在内存的动态存储区中分配一个长度为n的连续空间.保存tokenstring*/iftNULL{fprintflisting,“Outofmemoryerroratlined\n“,lineno;}else{strcpyt,s;/*该函数是字符串拷贝函数,用来将一个字符串复制到一个字符数组中。

*//*例如strcpystr1,“china“;作用是将”China“这个字符串拷贝到str1数组中*/}returnt;}staticintindentno0;defineINDENTindentno2defineUNINDENTindentno-2staticvoidprintSpacesvoid{inti;fori0;inodekindStmtK{switchtree-kind.stmt{caseIfKfprintflisting,“If\n“;break;caseWhileKfprintflisting,“While\n“;break;caseElseKfprintfl

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

当前位置:首页 > 职业教育 > 职高对口

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

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