版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、编译原理课程设计报告课题名C-一词法扫描器及语法分析器头现提交文档学生姓名:刘佳玉提交文档学生学号:2012141461134同组成员名单:无指导教师姓名:张县指导教师评阅成绩:指导教师评阅意见:提交报告时间:2015年6月10日目录 TOC o 1-5 h z HYPERLINK l bookmark0 o Current Document 编译原理课程设计报告1. HYPERLINK l bookmark4 o Current Document 1、课程设计目标2 HYPERLINK l bookmark6 o Current Document 2、分析与设计2程序结构2程序流程3词法分析
2、3 HYPERLINK l bookmark21 o Current Document 代码结构分析3. HYPERLINK l bookmark15 o Current Document token定义和类型3. HYPERLINK l bookmark17 o Current Document DNF分析4. HYPERLINK l bookmark19 o Current Document 语法分析4.代码结构分析4.节点定义和类型5. HYPERLINK l bookmark33 o Current Document 递归下降语法分析6. HYPERLINK l bookmark35
3、o Current Document 3、测试结果11流程11出错情况13、总结13 HYPERLINK l bookmark43 o Current Document 收获13 HYPERLINK l bookmark45 o Current Document 特色14 HYPERLINK l bookmark47 o Current Document 不足14 HYPERLINK l bookmark49 o Current Document 、程序代码实现14递归下降源代码14C-文法651、课程设计目标学生在学习编译原理课程过程中,结合各章节的构造编译程序的基本理论,要求用C或C+语言
4、描述及上机调试,实现一个C-Minus小编译程序(包括词法分析,语法分析等重要子程序),使学生将理论与实际应用结合起来,受到软件设计等开发过程的全面训练,从而提高学生软件开发的能力。要求:实现scanner和parser功能2、分析与设计程序结构语法分析采用递归下降方法的程序结构:本程序采用面向对象的思想编写,使用C语言实现,程序分为两部分:词法分析(scan)和语法分析(parse),分别将两个处理阶段写在两个函数中,分别是scan()和parse(),两个函数分别完成词法分析和语法分析的任务。scan()函数主要的工作是检查注释是否合法、词法分析获取token。parse()函数的主要工作
5、是根据scan()词法分析之后的token进行语法分析,生成语法树,最后并输出语法树。递归下降方法的程序流程图程序流程词法分析代码结构分析词法分析阶段的代码写在一个函数中sean()。main函数读取程序数据,将其存储在一个二维数组中,调用函数zhushierror(),确定程序是否存在注释错误,注释的错误主要是注释的符号不匹配。如果不存在注释错误,则调用sean()进行词法分析,否则报错。词法分析是对输入的数据一个字符一个字符的分析,将所分析出来的token存储在一个veetor中,方便后面语法分析时调用。词法分析没有什么错误限制,基本不会报错。所以在分析的同时,就会将所分析出的token函
6、数数组输出2.3.2token定义和类型token结构体定义如下:struettoken/token结构体Tokentypetokentype;/token类型ehartokenstring1100;/token串intlineno;/token行号;token类型:/定义的Token的类型(29种),分别对应于else、if、int、return、void、while、/+、-、*、/、=、/!=)、num、id、错误、结束typedefenumelsee=1,iff,intt,returnn,voidd,whilee,xiaoyudengyu,dayudengyu,dengyudengyu
7、,budengyu,10jiajian,cheng,chu,dayu,xiaoyu,dengyu,fenhao,douhao,zuokuohao,youkuohao,zuozhongkuohao,/22youzhongkuohao,zuohuakuohao,youhuakuohao,num,id,error,end29Tokentype;2.3.3DNF分析词法分析的dfA描述:词法分析的DFA如下所示,一共分为5个状态:STARTINNUMINID、INDBSYMDON。状态STAR表示开始状态,状态INNUM表示数字类型(NUMToken的状态,状态INID表示字符串类型Token的状态(
8、如关键字和一般的标示符),状态INDBSY表示双目运算符型Token的状态(如=、!=、=),状态DON表示接收状态。digitother2.4语法分析代码结构分析语法分析阶段的代码中,每一条文法都有相对应的函数,通过函数之间的递归调用来达到语法分析的目的。语法分析的过程主要是:在语法分析之前进行词法分析,然后通过递归向下分析法根据c-语言的文法进行语法分析,并生成语法树,最后打印语法树。下面是语法分析所用到的全局变量和函数的声明:tokencurrenttoken;当前tokentokenlasttoken;/上一个tokeninttokenxb=0;/token下标intblank=0;/
9、先行空格voidgettoken();/得到tokenvoidparseerror();/输出错误voidmatch(Tokentypett);/匹配treenode*compound_stmt();/函数声明voidprintspace(intn);/打印空格voidprinttree(treenode*t);/打印语法分析树treenode*newnode(Nodekindkind);/创建新节点treenode*args();treenode*call(treenode*k);/函数调用treenode*factor(treenode*k);treenode*term(treenode*
10、k);treenode*additive_expression(treenode*k);/加成的表达式treenode*simple_expression(treenode*k);/简单表达式treenode*varr();treenode*expression();treenode*expression_stmt();/treenode*return_stmt();/treenode*iteration_stmt();/whiletreenode*selection_stmt();/iftreenode*statement();/treenode*statement_list();/tree
11、node*local_declaration();/treenode*param(treenode*k);/treenode*param_list(treenode*k);/表达式声明返回式声明声明声明复合语句后者种类复合语句体后者复合语句体前者函参函参列表treenode*compound_stmt();/函数内容,复合语句treenode*params();/函数参数treenode*declaration();/函数声明treenode*declaration_list();/多个函数列表treenode*parse();/语法分析6a35c-Numbered_bec32794-fd6d
12、-47a8-a770-7c18d6f74896-节点定义和类型节点定义:structtreenode/树节点结构体treenode*child;/子节点treenode*brother;/兄弟节点intlineno;/所在行Nodekindnodekind;/节点类型charnodestring1100;/节点类型所代表的字符串,用于语法树打印;节点类型:/19种节点类型,分别表示int、id、void、数值、变量声明、数组声明、函数声明、/函数声明参数列表、函数声明参数、复合语句体、if、while、return、赋值、运算、节点种类递归下empty var- declarationt ex
13、pression;/数组元素、函数调用、函数调用参数列表、未知节点typedefenumints,ids,voids,nums,var,shuzu,hanshu,hancanlist,hancan,fuheyuju,ifs,whiles,returns,fuzhi,yunsuan,shuzuyuansu,hanshudiaoyong,hanshudiaoyongcanlist,unknownNodekind;6a35c-Numbered_bec32794-fd6d-47a8-a770-7c18d6f74896-降语法分析2.4310语法programFeclaration-listdeclar
14、ationistTdeclarationdeclarationdeclarationTva-declaration|fun-declarationvar_declarationttype-specifierID;|type-specifierIDNUM;type-specifiertint|voidfun-declatationttype-specifierID(params)|compound-stmtparamstparam_list|voidparam_listtparam,paramparamttype-specifierIDcompounds-tmttlocal-declaratio
15、nstatement-listlocal-declarationststatement-listtstatementstatementtexpression-stmt|compound-stmt|selection-stmt|iteration-stmt|return-stmtexpression-stmtselection-stmttif(expression)statementelsestatementiteration-stmttwhile(expression)statementreturn-stmttreturnexpression;expressiontvar=expression
16、|simple-expressionrelopt=|=|=|!=vartID|IDexpressionsimple-expressionadditive-expressionrelopadditive-expressionadditive-expressionttermaddoptermaddopt+|-termtfactormulopfactormulopt*|/factort(expression)|var|call|NUMcalltID(args)argstarg-list|emptyarg-listtexpression,expression2.4.32递归下降语法分析过程以下表格列出
17、了根据上文中的C-文法使用递归向下分析方法分析程序的过程,在代码部分只列出了函数名,具体函数见源代码。待分析文法programFeclaration-list分析函数treeNode*parse()分析说明C-谛言编写的程序由一组声名序列组成。parse(void)函数使用递归向卜分析方法直接调用declarationist()函数,并返回树节点代码treenode*parse()待分析文法declarationistdeclarationdeclaration分析函数treenode*declaration_list()分析说明C-语百编写的程序由一组声名序列组成。declarationis
18、t(void)函数使用递归向卜分析方法直接调用declaration。函数,并返回树节点代码treenode*declaration_list()待分析文法declarationAvar-declaration|fun-declarationvar_declaration”ype-specifierID;|type-specifierIDNUM;fun-declatationMype-specifierID(params)|compound-stmttype-specifierTint|void分析函数treenode*declaration()分析说明C-谛言的声明分为变量声明和函数声明。d
19、eclaration(void)函数并不是直接调用var-declaration或fun-declaration文法所对应的函数,令其返回节点,头际上程序并没有为var-declaration和fun-declaration文法定义函数,而是在declaration(void)函数中,通过求First集合的方式先确定是变量定义还是函数定义,然后分别根据探测的结果生成变量声明节点(Var_DeclK或函数声明节点(FunKo所以var-declaration和fun-declaration文法在declarationTvar-declaration|fun-declaration文法中就都已经分
20、析了代码treenode*declaration()待分析文法paramsAparam_list|void分析函数treenode*params()分析说明函数参数列表要么是void,要么是多个参数组成。params(void)函数先判断弟一个是void还是int,如果是int说明是由param_list组成,则调用param_list(TreeNode*k)函数递归向卜分析;如果是void说明可能是void型的参数,也可能参数就是void,所以再求其Follow集合,如果集合求出来是右括号,则说明参数就是void,于是新建一个VoidK节点就行;如果集合求出来不是右括号则说明是void型的参
21、数,然后再调用paramist(TreeNode*k)函数递归向卜分析,并将已经取出VoidK节点传递给param_list(TreeNode*k)函数代码treenode*params()待分析文法param_listTparam,param分析函数treenode*param_list(treenode*k)分析说明参数列表由param序列组成,并由逗方隔开。param_list(TreeNode*k)函数使用递归向卜分析方法直接调用param(TreeNode*k)函数,并返回树节点代码treenode*param_list(treenode*k)待分析文法paranrtype-spec
22、ifierID分析函数treenode*param(treenode*k)分析说明参数由int或void、标不符组成,最后可能有中括号表示数组。param(TreeNodek)函数根据探测先仃Token是int还是void而新建IntK或VoidK下点作为其弟一个子下点,然后新建IdK下点作为其弟一个子节点,最后探测Follow集合,是否是中括号,而确定是e再新建第二个子节点表示数组类型代码treenode*param(treenode*k)待分析文法compound-stmhlocal-declarationstatement-list分析函数treenode*compound_stmt()
23、分析说明旻合语句由用花播围起来的一组严明和语句组成。compound_stmt(void)函数使用递归向下分析方法直接调用local_declaration()函数和statement_list()函数,并根据返回的树节点作为其第一个子节点和第二个子节点代码treenode*compound_stmt()待分析文法local-declarations八emptyvar-declaration分析函数treenode*local_declaration()分析说明局部变重严明要么是空,要么由许多变重严明序列组成。local_declaration(void)函数通过判断先行的Token是否是in
24、t或void便可知道局部变量声明是否为空,如果不为空,则新建一个变量定义节点(Var_Decl0代码treenode*local_declaration()待分析文法statement-liststatement分析函数treenode*statement_list()分析说明由语句列表由0到多个statement组成statement_list(void)函数通过判断先行Token尖型是否为statement的First集合确止后面th否是一个statement,如果th,则使用递归向卜分析方法直接调用statement。函数代码treenode*statement_list()待分析文法s
25、tatementexpression-stmt|compound-stmt|selection-stmtreturn-stmt|iteration-stmt|分析函数treenode*statement()分析说明statement由表达式或复合语句或if语句或while语句或return语句构成statement(void)函数通过判断先行Token类型确定到底是哪一种类型。如果是IF则是if语句类型,如果是WHILE则是while语句类型,如果是RETURN则是return语句类型,如果是左大括号,则是复合语句类型,如果是ID、SEMILPAREnNUM则是表达式语句类型代码treenod
26、e*statement()待分析文法expression-stmtexpression;分析函数treenode*expression_stmt()分析说明表达式语句有一个可选的且后面跟着分号的表达式。expression_stmt(void)函数通过判断先行Token类型是否为分号,如果不是则直接调用函数expression()代码treenode*expression_stmt()待分析文法selection-stmtTf(expression)statementelsestatement分析函数:treenode*selection_stmt()分析selection_stmt(void
27、)函数直接调用expression()函数和statement()函数分别得到其第一个和第二个子节点,然后通过判断先行Token类型是否为ELSE如果是则直接调用statement()函数得到其第三个子节点代码treenode*selection_stmt()待分析文法iteration-stmtawhile(expression)statement分析函数treenode*iteration_stmt()分析让eration_stmt(void)函数直接调用expression。函数和statement。函数分别得到其第一个和第二个子节点代码treenode*iteration_stmt()
28、待分析文法return-stmtAreturnexpression;分析函数treenode*return_stmt()分析return_stmt(void)函数通过判断先仃Token类型是否为分号,如果不是则直接调用函数expression。得到其子节点代码treenode*return_stmt()待分析文法expressionvar=expression|simple-expression分析函数treenode*expression()分析expression(void)函数通过判断先行Token尖型是否为ID,如果不是说明只能是simple_expression情况,则调用simpl
29、e_expression(TreeNode*k)函数递归向卜分析;如果是ID说明可能是赋值语句,或simple_expression中的var和call类型的情况,所以再求具Follow集封,如果集名、求出来是赋,扈类型的Token,则说明是赋值语句,于是新建一个AssignK节点就行;如果集合求出来不是赋值类型的Token则说明是simple_expression中的var和call尖型的情况,然后再调用simple_expression(TreeNode*k)函数递归问卜分析,并将已经取出IdK节点传递给simple_expression(TreeNode*k)函数代码treenode*e
30、xpression()待分析文法varTD|IDexpression分析函数treenode*varr()分析varr(void)函数先新建一个IdK节点,再通过判断先行Token类型是否为左中括号,如果是则新建一个数组节点Arry_ElemK,将IdK作为Arry_ElemK节点的第一个子节点,再直接调用函数expression。得至1JArry_ElemK的第二个子节点,最后返回的节点时Arry_ElemK如果先行Token类型不是左中括号,则将之前的IdK返回代码treenode*varr()待分析文法simple-expressionadditive-expressionrelopad
31、ditive-expressionrelopT=|=|=|!=分析函数treenode*simple_expression(treenode*k)分析simple_expression(TreeNode*k)函数先调用additive_expression(TreeNode*k)函数返回一个节点,然后再一直判断后面的Token是否为=、=!=,如果是则新建OpK节点,然后令之前的节点为其第一个子节点,然后继续调用additive_expression(TreeNode*k)函数返回一个节点,作为OpK节点的第二个节占八、代码treenode*simple_expression(treenode
32、*k)待分析文法additive-expressionfermaddoptermaddopT+1-分析函数treenode*additiveexpression(treenode*k)分析additive_expression(TreeNode*k)函数先调用term(TreeNode*k)函数返回一个节点,然后再一直判断后面的Token是否为+或-,如果是则新建OpK节点,然后令之前的节点为其第一个子节点,term(TreeNode*k)函数返回一个节点,作为OpK节点的第二个节点然后继续调用代码treenode*additive_expression(treenode*k)待分析文法ter
33、mtfactormulopfactormulopT*|/分析函数treenode*term(treenode*k)分析term(TreeNode*k)函数先调用factor(TreeNode*k)函数返回一个节点,然后再一直判断后面的Token是否为*或/,如果是则新建OpK节点,然后令之前的节点为其第一个子节点,然后继续调用actor(TreeNode*k)函数返回一个节点,作为OpK节点的第二个节点代码treenode*term(treenode*k)待分析文法factorT(expression)|var|call|NUM分析函数treenode*factor(treenode*k)分析
34、factor(TreeNode*k)函数首先判断k是否为空,如果不为空,则k为上面传下来的已经解析出来的以ID开头的var,此时可能为call或var的情况,然后判断后面的Token是否为左括号,如果是则说明是call的情形,如果不是则为var的情形。如果k为空,再根据先行的Token类型判断是4中推导中的哪一种,然后直接调用相关的函数返回一个节点代码treenode*factor(treenode*k)待分析文法callT1D(args)分析函数treenode*call(treenode*k)分析call(TreeNode*k)函数新建一个call语句的节点CallK,如果k不为空,则将k
35、设为CallK的第一个子节点,然后通过调用args(void)函数获得其第二个节点,最后返回CallK节点代码treenode*call(treenode*k)待分析文法argsTarg-list|emptyarg-listTexpression,expression分析函数treenode*args()分析factor(TreeNode*k)函数首先判断后面的Token是否为右括如果是则说明是empty的情形,如果不是则为至少有一个expression的情形,然后调用expression。函数返回节点,然后一直判断后面的Token是否为逗方,如果是则说明后面还有一个expression,则再
36、调用expression。函数,使各expression返回的下点为兄弟节点,然后再将第一个expression返回的节点作为函数调用语句参数节点ArgsK的子节点代码treenode*args()3、测试结果流程测试数据:测试结果:词法分析:语法分析:出错情况若注释没有结束符号:则提示删除注释出错若含有未知Token比如char则语法分析出错4、总结收获在本次课程设计中增加了自己的动手能力,锻炼了构造一个项目的框架方法,能够很好的给出系统的框架,并且能够按照程序流程进行程序的编写。能够灵活运用递归下降的方法进行分析问题,在词法分析中掌握了状态机的转变,同时能够熟练运用状态机进行字符的匹配。在
37、语法分析中,学习到了怎么样通过文法构建代码,以及根据文法编写代码带来的相关问题,如左递归,节点的定义等。特别是在写语法分析器的时候,已经对编译器的语法分析的内容有了一定的了解,所以直接进行了理论的学习。首先自己对递归向下分析法进行了学习,将书上的几个递归向下分析的伪代码看过之后,自己对递归向下的分析方法的原理有了初步的认识,大概知道了根据文法怎么分析。但是由于C-语言给出的文法有左递归存在,于是自己将存在左递归的文法改写成EBNF勺形式,并据此进行代码编写。整个过程可以说是痛并快乐着,一方面自己在编写代码的时候遇到了很多问题,这也是自己动手能力不足的一个表现。特色在词法分析方面,使用全局变量Z
38、S来判断当前字符是否是注释,并且通过ZS的值判断注释是否合法。整体来说,代码简介明了,没有复杂的类的关系,树节点只有孩子和兄弟两个子节点,没有复杂的节点之间的关系。不足由于各函数之间逻辑关系比较复杂,代码还存在一些错误,需要通过测试来修复bug5、程序代码实现递归下降源代码#include#include#include#include#include#include#includeuSingnameSpaceStd;charS10051005;/文本charp10051005;chart1005;/当前token串charlinShi1100;/临时数组intk;/文本行数intzs;/注释
39、标记,1表示是注释,0表示不是注释voidzhushierror()/注释错误inti,j,len;zs=0;for(i=0;ik-1;i+)len=strlen(si);for(j=0;jlen-1;j+)if(sij=/&sij+1=*)if(zs=0)zs=1;elsereturn;if(sij=*&sij+1=/)if(zs=1)zs=0;elsezs=1;return;/定义的Token的类型(29种),分别对应于else、if、int、return、void、while、/+、-、*、/、=、=、/!=、=、;、,、(、)、numid、错误、结束typedefenumelsee=1
40、,iff,intt,returnn,voidd,whilee,xiaoyudengyu,dayudengyu,dengyudengyu,budengyu,/10jia,jian,cheng,chu,dayu,xiaoyu,dengyu,fenhao,douhao,zuokuohao,youkuohao,zuozhongkuohao,/22youzhongkuohao,zuohuakuohao,youhuakuohao,num,id,error,end/29Tokentype;structtoken/token结构体Tokentypetokentype;/token类型chartokenstri
41、ng1100;/token串intlineno;/token行号;Tokentypegettokentype(charc)Tokentypeto;if(!strcmp(c,else)to=elsee;elseif(!strcmp(c,if)to=iff;elseif(!strcmp(c,return)to=returnn;elseif(!strcmp(c,int)to=intt;elseif(!strcmp(c,void)to=voidd;elseif(!strcmp(c,while)to=whilee;elseif(!strcmp(c,+)to=jia;elseif(!strcmp(c,-)
42、to=cheng;elseif(!strcmp(c,/)to=chu;elseif(!strcmp(c,)to=xiaoyu;elseif(!strcmp(c,)to=dayu;elseif(!strcmp(c,=)to=dengyudengyu;elseif(!strcmp(c,!=)to=budengyu;elseif(!strcmp(c,=)to=dengyu;elseif(!strcmp(c,;)to=fenhao;elseif(!strcmp(c,)to=douhao;elseif(!strcmp(c,()to=youkuohao;elseif(!strcmp(c,)to=zuozh
43、ongkuohao;elseif(!strcmp(c,)to=youzhongkuohao;elseif(!strcmp(c,)to=zuohuakuohao;elseif(!strcmp(c,)to=youhuakuohao;elseif(!strcmp(c,num)to=id;elseif(!strcmp(c,end)to=end;returnto;vectortokenlist;/token序列voidscan()inti,j,m,l,n;/下标intf,flag;/标记intlen;/当前行长度charguan101005=else,if,int,return,void,while;/
44、关键字charsp101005=,=,!=;/双目比较符charfu1005=+,-,*,/,=,;,(,),!;/单目符号elseif(!strcmp(c,id)zs=0;for(i=0;ik-1;i+)len=strlen(si);printf(%d:,i+1);printf(%sn,si);if(len=0)/空行continue;for(j=0;j=1&sij-1=*&sij=/)zs=0;/注释结束空格continue;if(sij=)/continue;if(sij=a)|(sij=A)/l=j;m=0;while(sil=a)|(sil=A)tm+=sil+;tm=0;f=1;/
45、标记for(n=0;n=5;n+)if(!strcmp(t,guann)f=0;printf(%d:reservedword:%sn,i+1,t);tokento;to.tokentype=gettokentype(t);strcpy(to.tokenstring,t);to.lineno=i+1;tokenlist.push_back(to);break;if(f)e_se9一OiOf(smVAnoll.sfrprinffnamecpy(=nshi=id)二sfrcpyao.fokensmngu%swlJ)%八(fo.fokenfypeHge#okeefype(=nshi)+)Hw3foke
46、n%(hq9hHfpshqmm+QOQOse(0-sfri+NUMH/llsm(s=v=kSs=u=u-Qcpy(-inshi=nurrr)八Hprinff+)Astrcpy(to.tokenstring,t);to.lineno=i+1;tokenlist.push_back(to);j=l-1;else/符号l=j;n=0;while(1)flag=0;/标记for(m=0;m=15;m+)if(sil=fum)flag=1;tn+=fum;l+;break;if(!flag)break;tn=0;if(!strcmp(t,/*)/注释开始zs=1;j-;elseflag=1;for(m=
47、0;m=3;m+)/双目比较符if(!strcmp(t,spm)tokento;to.tokentype=gettokentype(t);strcpy(to.tokenstring,t);to.lineno=i+1;tokenlist.push_back(to);printf(%d:specialcharacters:%sn,i+1,t);flag=0;break;if(flag)/单目符号for(m=0;mn;m+)tokento;linshi0=tm;linshi1=0;to.tokentype=gettokentype(linshi);strcpy(to.tokenstring,lins
48、hi);to.lineno=i+1;tokenlist.push_back(to);printf(%d:specialcharacters:%cn,i+1,tm);/一个一个输出j=l-1;tokento;to.lineno=i;to.tokentype=end;strcpy(to.tokenstring,endfile);tokenlist.push_back(to);19种节点类型,分别表示int、id、void、数值、变量声明、数组声明、函数声明、/函数声明参数列表、函数声明参数、复合语句体、if、while、return、赋值、运算、/数组元素、函数调用、函数调用参数列表、未知节点ty
49、pedefenumints,ids,voids,nums,var,shuzu,hanshu,hancanlist,hancan,fuheyuju,ifs,whiles,returns,fuzhi,yunsuan,shuzuyuansu,hanshudiaoyong,hanshudiaoyongcanlist,unknownNodekind;/节点种类typedefenumVoid,IntegerExptype;/表达式种类treenode*child;/子节点treenode*brother;/兄弟节点intlineno;/所在行Nodekind nodekind;/节点类型char node
50、string1100;/节点类型所代表的字符串,用于语法树打印用于语法树打印;tokencurrenttoken;/当前tokentokenlasttoken;/上一个tokeninttokenxb=0;/token下标intblank=0;/先行空格voidgettoken();/得到tokenvoidparseerror();/输出错误voidmatch(Tokentypett);/匹配treenode*compound_stmt();/函数声明voidprintspace(intn);/打印空格voidprinttree(treenode*t);/打印语法分析树treenode*newn
51、ode(Nodekindkind);/创建新节点treenode*args();treenode*call(treenode*k);/函数调用treenode*factor(treenode*k);treenode*term(treenode*k);treenode*additive_expression(treenode*k);/加成的表达式treenode*simple_expression(treenode*k);/简单表达式treenode*varr();treenode*expression();treenode*expression_stmt();/表达式声明treenode*re
52、turn_stmt();/返回式声明treenode*iteration_stmt();/while声明treenode*selection_stmt();/if声明treenode*statement();/复合语句后者种类treenode*statement_list();/复合语句体后者treenode*local_declaration();/复合语句体前者treenode*param(treenode*k);/函参treenode*param_list(treenode*k);/函参列表treenode*compound_stmt();/函数内容,复合语句treenode*param
53、s();/函数参数treenode*declaration();/函数声明treenode*declaration_list();/多个函数列表treenode*parse();/语法分析voidgettoken()/得到tokenlasttoken=currenttoken;currenttoken=tokenlisttokenxb+;voidparseerror()/输出错误coutcurrenttoken.linenolineparseerror!endl;voidmatch(Tokentypett)/匹配/coutliuendl;/coutct:currenttoken.tokenty
54、pett:ttendl;if(currenttoken.tokentype=tt)gettoken();elsecoutmatcherrorendl;parseerror();voidprintspace(intn)/打印空格inti;for(i=0;in;i+)coutnodekind=ints)printf(intn);elseif(t-nodekind=voids)printf(voidn);elseif(t-nodekind=ids)printf(id:%sn,t-nodestring);elseif(t-nodekind=nums)elseif(t-nodekind=var)prin
55、tf(varn);elseif(t-nodekind=shuzu)printf(shuzushengmingn);elseif(t-nodekind=hanshu)printf(hanshushengmingn);elseif(t-nodekind=hancanlist)printf(hancanlistn);elseif(t-nodekind=hancan)printf(hancann);elseif(t-nodekind=fuheyuju)elseif(t-nodekind=ifs)printf(ifn);elseif(t-nodekind=whiles)printf(whilen);el
56、seif(t-nodekind=returns)printf(returnn);elseif(t-nodekind=fuzhi)printf(fuzhin);elseif(t-nodekind=yunsuan)printf(yunsuan:%sn,t-nodestring);elseif(t-nodekind=shuzuyuansu)elseif(t-nodekind=hanshudiaoyong)printf(hanshudiaoyongn);elseif(t-nodekind=hanshudiaoyongcanlist)printf(hanshudiaoyongcanlistn);elseprintf(unknownn);blank+;/子树空格多一个if(t-child!=NULL)printtree(t-child);blank-;/兄弟不变t=t-brother;创建新节点treenode*newnode(Nodekindkind)/treenode*p=(treenode*)malloc(sizeof(treenode);if(p=NULL)coutnewnodeerrorchild=NULL;p-brother=NULL;p-lineno=currenttoken.lineno;p-
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 保荐制下的发行人选择机制
- 2024年国际物流仓储中心租赁合同
- 2024年广告发布合同:广告公司与媒体之间的广告投放协议
- 2024年工业设计知识产权保护合同
- 2024年影视剧本购买合同
- 2024年个人借款咨询服务合同
- 2024年度汽车制造行业C型钢采购合同
- 深层生态理论视域下劳动教育融入中职语文教学的研究
- 2024年度SET协议电商数据分析与许可合同
- 2024年产线技术升级合同
- 正余弦定理知识点权威总结18页
- 国企纪检监察嵌入式监督的探索与实践
- 浅议小升初数学教学衔接
- 设备安装应急救援预案
- 深基坑工程降水技术及现阶段发展
- 暂堵压裂技术服务方案
- 《孔乙己》公开课一等奖PPT优秀课件
- 美的中央空调故障代码H系列家庭中央空调(第一部分多联机)
- 业主委员会成立流程图
- (完整版)全usedtodo,beusedtodoing,beusedtodo辨析练习(带答案)
- 广联达办公大厦工程施工组织设计
评论
0/150
提交评论