1、四川大学Cminus语法分析器纯代码#include#include#include#includeusingnamespacestd; #defineBUFLEN256#defineMAXLEN256#defineMAXTOKENLEN40#defineMAXCHILDREN4staticintlineno;staticintlinepos=0;/读取的字符在lineBuf的位置staticintEOF_FLAG=false;staticintbufsize=0;/lineBuf的长度staticcharlineBufBUFLEN;FILE*source;chartokenStringMAX
2、TOKENLEN+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*s
3、tr; 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; ret
4、urnEOF; 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!=DONE)
5、 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; Curren
6、tToken=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; c
7、ase: 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=) Cur
8、rentToken=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; CurrentTok
9、en=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=OVER
10、; 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) tokenStringtoken
11、StringIndex=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/节点类型和字符串关系 strin
12、gstr; 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_St
13、mtK,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) re
14、turnnodekindi.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*pa
15、ram(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);Tree
16、Node*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,s)
17、; 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=IntK
18、|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; wh
19、ile(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/(token=
20、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(Var_
21、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; TreeN
22、ode*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) Tr
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1