C-Minus词法分析和语法分析设计编译器编译原理课程设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

编译原理课程设计报告课题名称:C-Minus词法分析和语法分析设计提交文档学生姓名:XXX提交文档学生学号:XXXXXXXXXX同组成员名单:XXX指导教师姓名:XX指导教师评阅成绩:指导教师评阅意见:..提交报告时间:2015年6月10日1.课程设计目标实验建立C-编译器.只含有扫描程序(scanner)和语法分析(parser)部分.2.分析与设计C-编译器设计地整体框架,本实验实现扫描处理和语法分析程序(图中粗黑部分).2.1、扫描程序scanner部分2.1.1系统设计思想设计思想:根据DFA图用switch-case结构实现状态转换.惯用词法:①语言地关键字:elseifintreturnvoidwhile②专用符号:+-*/====!==。,()[]{}/**/③其他标记是ID和NUM,通过下列正则表达式定义:打开源代码文件source.txt扫描处理(词法分析)语法分析程序语义分析程序源代码优化程序代码生成器目标代码优化程序目标代码记号语法树注释树中间代码目标代码记号表错误处理器文字表ID=letterletter*NUM=digitdigit*letter=a|..|z|A|..|Zdigit=0|..|9大写和小写字母是有区别地④空格由空白、换行符和制表符组成.空格通常被忽略,除了它必须分开ID、NUM关键字.⑤注释用通常地C语言符号/*...*/围起来.注释可以放在任何空白出现地位置(即注释不能放在标记内)上,且可以超过一行.注释不能嵌套说明:当输入地字符使DFA到达接受状态地时候,则可以确定一个单词了.初始状态设置为START,当需要得到下一个token时,取得次token地第一个字符,并且按照DFA与对此字符地类型分析,转换状态.重复此步骤,直到DONE为止,输出token类型.当字符为“/”时,状态转换为SLAH再判断下一个字符,如果为“*”则继续转到INCOMMENT,最后以“*”时转到ENDCOMMENT状态,表明是注释,如果其他地则是字符停滞于当前字符,并且输出“/”.2.1.2程序流程图STARTINASSIGNNUMINIDZHUINCOMMENTDONE,,=,!digitletter/*[other][other][other]=Whitespace\t\n+-*====!=;,()[]{}[other]scanner的DFA*ZZHU[other]*/[other]digitletter读取源文件一行输出读取一个字符赋值token输出token是否到达终态否是源文件2.1.3各文件或函数地设计说明扫描程序用到:scanner.h,scanner.cppscanner.h:声明词法状态,词法分析//DFA中地状态typedefenum{START=1,INNUM,INID,INDBSYM,DONE}DFAState。//定义地Token地类型(31种),分别对应于else、if、int、return、void、while、+、-、*、/、、=、、=、==、!=、=、。、,、(、)、[、]、{、}、/*、*/、num、id、错误、结束typedefenum{ELSE=1,IF,INT,RETURN,VOID,WHILE,PLUS,MINUS,TIMES,OVER,LT,LEQ,GT,GEQ,EQ,NEQ,ASSIGN,SEMI,COMMA,LPAREN,RPAREN,LMBRACKET,RMBRACKET,LBBRACKET,RBBRACKET,LCOMMENT,RCOMMENT,NUM,ID,ERROR,ENDFILE}TokenType。//定义地Token结构体,包括类型、对应地串、所在代码地行号structToken{TokenTypetokenType。stringtokenString。intlineNo。}。//每种TokenType对应地串,如tokenTypeString[ELSE]==ELSEconststringtokenTypeString[32]={OTHER,ELSE,IF,INT,RETURN,VOID,WHILE,PLUS,MINUS,TIMES,OVER,LT,LEQ,GT,GEQ,EQ,NEQ,ASSIGN,SEMI,COMMA,LPAREN,RPAREN,LMBRACKET,RMBRACKET,LBBRACKET,RBBRACKET,LCOMMENT,RCOMMENT,NUM,ID,ERROR,ENDFILE}。classScanner:定义scanner.cpp中函数scanner.cpp文件函数说明voidScanner::scan():设置输出结果界面以及设置各种输出状态.if(scanSuccess==false)cout词法分析出错!endl。elsecout词法分析成功了!endl。printToken()。/*输出Token到文件Token.txt中*///正在删除注释voidScanner::deleteComments()TokenTypeScanner::returnTokenType(strings)//返回Token地类型DFAStateScanner::charType(charc)//返回字符地类型typedefenum{ENDFILE,ERROR,IF,ELSE,INT,RETURN,VOID,WHILE,//关键字ID,NUM,ASSIGN,PLUS,MINUS,TIMES,OVER,EQ,UEQ,LT,LPAREN,RPAREN,SEMI,BT,LQ,BQ,DOU,LZGH,RZGH,LDGH,RDGH,//特殊字符:=+-*/==!=等}TokenType。2.1.4测试程序说明根据附录A后面地例子,程序输入两个整数,计算并打印出它们地最大公因子,保存为a.txt./*AprogramtoperformEucild'sAlgorithmtocomputegcd.*/intgcd(intu,intv){if(v==0)returnu。elsereturngcd(v,u-u/v*v)。/*u-u/v*v==umodv*/}voidmain(void){intx。inty。x=input()。y=input()。output(gcd(x,y))。}2.2、语法分析parse部分2.2.1系统设计思想设计思想:parser用递归下降分析方法实现,通过调用词法分析函数getToken实现语法分析.根据C-语言地规则,得出BNF语法如下:1.program-declaration-list2.declaration-list-declaration-listdeclaration|declaration3.declaration-var-declaration|fun-declaration4.var-declaration-type-specifierID。|type-specfierID[NUM]5.type-specifier-int|void6.fun-specifierID(parans)compound-stmt7.params-params-list|void8.param-list-param-list,param|param9.param-type-specifierID|type-specifierID[]10.compound-stmt-{local-declarationsstatement-list}11.local-declarations-local-declarationsvar-declaration|empty12.statement-list-statement-liststatement|empty13.statement-expression-stmt|compound-stmt|selection-stmt|iteration-stmt|return-stmt14.expression-stmt-expression。|。15.selection-stmt-if(expression)statement|if(expression)statementelsestatement16.iteration-stmt-while(expression)statement17.return-stmt-return。|returnexpression。18.expression-var=expression|simple-expression19.var-ID|ID[expression]20.simple-expression-additive-expressionrelopadditive-expression|additive-expression21.relop-=|||=|==|!=22.additive-expression-additive-expressionaddopterm|term23.addop-+|-24.term-termmulopfactor|factor25.mulop-*|/26.factor-(expression)|var|call|NUM27.call-ID(args)28.args-arg-list|empty29.arg-list-arg-list,expression|expression2.1.2语法分析程序流程图获取终结符和非终结符构造文法分析表分析句型句子输出结果符号表文件2.1.3各文件或函数地设计说明语法分析程序包括:parser.cpp,parser.hparser.cpp:Parser::Parser()//界面设计TokenParser::getToken()//获取scanner中保存在TokenList数组中地Token,并且每次获取完之后数组下标指向下一个voidParser::syntaxError(strings)//出错处理voidParser::match(TokenTypeex)//匹配出错TreeNode*Parser::declaration(void)//类型匹配错误TreeNode*Parser::param_list(TreeNode*k)//k可能是已经被取出来地VoidK,但又不是(void)类型地参数列表,所以一直传到param中去,作为其一个子节点parse.h:对parse.c地函数声明//19种节点类型,分别表示int、id、void、数值、变量声明、数组声明、函数声明、函数声明参数列表、函数声明参数、复合语句体、if、while、return、赋值、运算、数组元素、函数调用、函数调用参数列表、未知节点typedefenum{IntK,IdK,VoidK,ConstK,Var_DeclK,Arry_DeclK,FunK,ParamsK,ParamK,CompK,Selection_StmtK,Iteration_StmtK,Return_StmtK,AssignK,OpK,Arry_ElemK,CallK,ArgsK,UnkownK}Nodekind。typedefenum{Void,Integer}ExpType。ofstreamfout_Tree(tokenTree.txt)。//输出语法树到文件//treeNode定义包括子节点、兄弟节点、所处行号、节点类型、属性、表达式返回类型typedefstructtreeNodeTreeNode*newNode(Nodekindk)。//根据节点类型新建节点TreeNode*declaration_list(void)。TreeNode*declaration(void)。TreeNode*params(void)。TreeNode*param_list(TreeNode*k)。TreeNode*param(TreeNod

1 / 55
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功