ImageVerifierCode 换一换
格式:DOCX , 页数:43 ,大小:22.33KB ,
资源ID:10095401      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10095401.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(最新四川大学Cminus语法分析器纯代码.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

最新四川大学Cminus语法分析器纯代码.docx

1、最新四川大学Cminus语法分析器纯代码#include#include#include#includeusingnamespacestd; #defineBUFLEN256#defineMAXLEN256#defineMAXTOKENLEN40#defineMAXCHILDREN4staticintlineno;staticintlinepos=0;/读取的字符在lineBuf的位置staticintEOF_FLAG=false;staticintbufsize=0;/lineBuf的长度staticcharlineBufBUFLEN;FILE*source;chartokenStringM

2、AXTOKENLEN+1;stringoutput;/输出文件 enumTokenType ENDFILE,ERROR, IF,ELSE,INT,RETURN,VOID,WHILE, ID,NUM, ASSIGN,EQ,LT,PLUS,MINUS,TIMES,OVER,LPAREN,RPAREN,SEMI,LBRACKET,RBRACKET,LBRACE,RBRACE,COMMA, GT,GEQ,NEQ,LEQ; enumStateType START,INASSIGN,INCOMMENT,INNUM,INID,DONE,PRECOMMENT,AFTERCOMMENT; struct char

3、*str; TokenTypetok;ReserverWords6=if,IF,else,ELSE,int,INT,return,RETURN,void,VOID,while,WHILE; voidUnGetNextChar() if(!EOF_FLAG) linepos-; intGetNextChar() if(!(lineposbufsize) lineno+; if(fgets(lineBuf,BUFLEN-1,source) bufsize=strlen(lineBuf); linepos=0; returnlineBuflinepos+; else EOF_FLAG=true; r

4、eturnEOF; else returnlineBuflinepos+; TokenTypeReservedLookUp(char*s) inti; for(i=0;i6;i+) if(!strcmp(s,ReserverWordsi.str) returnReserverWordsi.tok; returnID; TokenTypeGetToken() StateTypestate=START;/初始状态为start boolsave; TokenTypeCurrentToken; inttokenStringIndex=0; stringassign=; while(state!=DON

5、E) intc=GetNextChar(); save=true; switch(state) caseSTART: if(isdigit(c) state=INNUM; elseif(isalpha(c) state=INID; elseif(c=)|(c=)|(c=!) state=INASSIGN; assign+=char(c); elseif(c=)|(c=t)|(c=n) save=false; elseif(c=/) save=false; state=PRECOMMENT; else state=DONE; switch(c) caseEOF: save=false; Curr

6、entToken=ENDFILE; break; case+: CurrentToken=PLUS; break; case-: CurrentToken=MINUS; break; case*: CurrentToken=TIMES; break; case(: CurrentToken=LPAREN; break; case): CurrentToken=RPAREN; break; case;: CurrentToken=SEMI; break; case: CurrentToken=LBRACKET; break; case: CurrentToken=RBRACKET; break;

7、 case: CurrentToken=LBRACE; break; case: CurrentToken=RBRACE; break; case,: CurrentToken=COMMA; break; default: CurrentToken=ERROR; break; break; caseINCOMMENT: save=false; if(c=EOF) state=DONE; CurrentToken=ENDFILE; elseif(c=*) state=AFTERCOMMENT; else state=INCOMMENT; break; caseINASSIGN: if(c=) C

8、urrentToken=EQ; state=DONE; elseif(assign=!) UnGetNextChar(); save=false; CurrentToken=ERROR; state=DONE; elseif(assign=) UnGetNextChar(); save=false; CurrentToken=ASSIGN; state=DONE; elseif(assign=) UnGetNextChar(); save=false; CurrentToken=LT; state=DONE; else UnGetNextChar(); save=false; CurrentT

9、oken=GT; state=DONE; break; caseINNUM: if(!isdigit(c) UnGetNextChar(); save=false; state=DONE; CurrentToken=NUM; break; caseINID: if(!isalpha(c) UnGetNextChar(); save=false; state=DONE; CurrentToken=ID; break; casePRECOMMENT: if(c=*) state=INCOMMENT; save=false; else UnGetNextChar(); CurrentToken=OV

10、ER; state=DONE; break; caseAFTERCOMMENT: save=false; if(c=/) state=START; elseif(c=*) state=AFTERCOMMENT; else state=INCOMMENT; break; caseDONE: default: state=DONE; CurrentToken=ERROR; break; if(save)&(tokenStringIndex=MAXTOKENLEN) tokenStringtokenStringIndex+=(char)c; if(state=DONE) tokenStringtok

11、enStringIndex=0; if(CurrentToken=ID) CurrentToken=ReservedLookUp(tokenString); returnCurrentToken; enumNodeKind/节点类型 FuncK,IntK,IdK,ParamsK,ParamK,CompK,ConstK,CallK,ArgsK,VoidK,Var_DeclK,Arry_DeclK,Arry_ElemK,AssignK/*,WhileK*/,OpK, Selection_StmtK,Iteration_StmtK,Return_StmtK;struct/节点类型和字符串关系 str

12、ingstr; NodeKindnk;nodekind18=Funck,FuncK,IntK,IntK,IdK,IdK,ParamsK,ParamsK,ParamK,ParamK,CompK,CompK,ConstK,ConstK,CallK,CallK,ArgsK,ArgsK,VoidK,VoidK,Var_DeclK,Var_DeclK,Arry_DeclK,Arry_DeclK,Arry_ElemK,Arry_ElemK,AssignK,AssignK,/*WhileK,WhileK,*/OpK,OpK,Selection_StmtK,Selection_StmtK,Iteration_

13、StmtK,Iteration_StmtK,Return_StmtK,Return_StmtK; struct/符号与字符串关系 stringstr; TokenTypetk;Ope11=,ASSIGN,=,EQ,GT,=,GEQ,!=,NEQ,=,LEQ; stringOpeLookUp(TokenTypetk)/操作符转换为字符串 inti; for(i=0;i11;i+) if(tk=Opei.tk) returnOpei.str; stringChange(NodeKindnk)/节点类型转换为字符串 inti; for(i=0;i19;i+) if(nk=nodekindi.nk)

14、returnnodekindi.str; break; TokenTypetoken;structTreeNode structTreeNode*child4; structTreeNode*sibling; intlineno;NodeKindnodekind; unionTokenTypeop;intval;constchar*name;attr; TreeNode*declaration_list(void);TreeNode*declaration(void);TreeNode*params(void);TreeNode*param_list(TreeNode*p);TreeNode*

15、param(TreeNode*p);TreeNode*compound_stmt(void);TreeNode*local_declaration(void);TreeNode*statement_list(void);TreeNode*statement(void);TreeNode*expression_stmt(void);TreeNode*selection_stmt(void);TreeNode*iteration_stmt(void);TreeNode*return_stmt(void);TreeNode*expression(void);TreeNode*var(void);Tr

16、eeNode*simple_expression(TreeNode*p);TreeNode*additive_expression(TreeNode*p);TreeNode*term(TreeNode*p);TreeNode*factor(TreeNode*p);TreeNode*call(TreeNode*p);TreeNode*args(void); char*copyString(char*s) intn; char*t; if(s=NULL) returnNULL; n=strlen(s)+1; t=(char*)malloc(n); if(t=NULL) else strcpy(t,

17、s); returnt; voidmatch(TokenTypeexpected) if(token=expected) token=GetToken(); else coutunexpectedtokenendl; TreeNode*newNode(NodeKindkind) TreeNode*t=(TreeNode*)malloc(sizeof(TreeNode); inti; if(t=NULL) ; else for(i=0;ichildi=NULL; t-sibling=NULL;t-nodekind=kind;t-lineno=lineno; if(kind=OpK|kind=In

18、tK|kind=IdK) if(kind=IdK) t-attr.name=; if(kind=ConstK) t-attr.val=0; returnt; TreeNode*declaration_list(void)/declaration_list-declaration_listdeclaration|declaration TreeNode*t=declaration(); TreeNode*p=t; while(token!=INT)&(token!=VOID)&(token!=ENDFILE) token=GetToken(); if(token=ENDFILE) break;

19、while(token=INT|token=VOID) TreeNode*q; q=declaration(); if(q!=NULL) if(t=NULL) t=p=q; else p-sibling=q; p=q; match(ENDFILE); returnt; TreeNode*declaration(void) TreeNode*t=NULL; TreeNode*p=NULL; TreeNode*q=NULL; TreeNode*s=NULL; TreeNode*a=NULL; if(token=INT) p=newNode(IntK); match(INT); else/(toke

20、n=VOID) p=newNode(VoidK); match(VOID); if(p!=NULL&token=ID) q=newNode(IdK); q-attr.name=copyString(tokenString); match(ID); if(token=LPAREN) t=newNode(FuncK); t-child0=p;/p是t子节点 t-child1=q; match(LPAREN); t-child2=params(); match(RPAREN); t-child3=compound_stmt(); elseif(token=LBRACKET) t=newNode(Va

21、r_DeclK); a=newNode(Arry_DeclK); t-child0=p;/p是t子节点 t-child1=a; match(LBRACKET); s=newNode(ConstK); s-attr.val=atoi(tokenString); match(NUM); a-child0=q; a-child1=s; match(RBRACKET); match(SEMI); elseif(token=SEMI) t=newNode(Var_DeclK); t-child0=p; t-child1=q; match(SEMI); else ; else ; returnt; Tre

22、eNode*params(void)/params_list|void TreeNode*t=newNode(ParamsK); TreeNode*p=NULL; if(token=VOID) p=newNode(VoidK); match(VOID); if(token=RPAREN) if(t!=NULL) t-child0=p; else/参数列表为(voidid,) t-child0=param_list(p); else/(token=INT) t-child0=param_list(p); returnt; TreeNode*param_list(TreeNode*k)/params_list-params_list,param|param TreeNode*t=param(k); TreeNode*p=t; k=NULL;/没有要传给param的VoidK,所以将k设为NULL while(token=COMMA) TreeNode*q=NULL; match(COMMA); q=param(k); if(q!=NULL) if(t=NULL) t=p=q; else p-sibling=q; p=q; returnt; TreeNode*param(TreeNode*k)

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

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