版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上#include#include#include#includeusingnamespacestd; #defineBUFLEN256#defineMAXLEN256#defineMAXTOKENLEN40#defineMAXCHILDREN4staticintlineno;staticintlinepos=0;/讀取的字符在lineBuf的位置staticintEOF_FLAG=false;staticintbufsize=0;/lineBuf的長度staticcharlineBufBUFLEN;FILE*source;chartokenStringMAXTOKEN
2、LEN+1;stringoutput;/輸出文件 enumTokenTypeENDFILE,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; enumStateTypeSTART,INASSIGN,INCOMMENT,INNUM,INID,DONE,PRECOMMENT,AFTERCOMMENT; structchar*str;TokenType
3、tok;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+;elseEOF_FLAG=true;returnEOF;elsereturnlineBuf
4、linepos+; TokenTypeReservedLookUp(char*s)inti;for(i=0;i6;i+)if(!strcmp(s,ReserverWordsi.str)returnReserverWordsi.tok;returnID; TokenTypeGetToken()StateTypestate=START;/初始狀態(tài)為startboolsave;TokenTypeCurrentToken;inttokenStringIndex=0;stringassign=;while(state!=DONE)intc=GetNextChar();save=true;switch(s
5、tate)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;elsestate=DONE;switch(c)caseEOF:save=false;CurrentToken=ENDFILE;break;case+:CurrentToken=PLUS;break;case-:Cu
6、rrentToken=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;case:CurrentToken=LBRACE;break;case:CurrentToken=RBRACE;break;case,:CurrentToken=COMMA
7、;break;default:CurrentToken=ERROR;break;break;caseINCOMMENT:save=false;if(c=EOF)state=DONE;CurrentToken=ENDFILE;elseif(c=*)state=AFTERCOMMENT;elsestate=INCOMMENT;break;caseINASSIGN:if(c=)CurrentToken=EQ;state=DONE;elseif(assign=!)UnGetNextChar();save=false;CurrentToken=ERROR;state=DONE;elseif(assign
8、=)UnGetNextChar();save=false;CurrentToken=ASSIGN;state=DONE;elseif(assign=)UnGetNextChar();save=false;CurrentToken=LT;state=DONE;elseUnGetNextChar();save=false;CurrentToken=GT;state=DONE;break;caseINNUM:if(!isdigit(c)UnGetNextChar();save=false;state=DONE;CurrentToken=NUM;break;caseINID:if(!isalpha(c
9、)UnGetNextChar();save=false;state=DONE;CurrentToken=ID;break;casePRECOMMENT:if(c=*)state=INCOMMENT;save=false;elseUnGetNextChar();CurrentToken=OVER;state=DONE;break;caseAFTERCOMMENT:save=false;if(c=/)state=START;elseif(c=*)state=AFTERCOMMENT;elsestate=INCOMMENT;break;caseDONE:default:state=DONE;Curr
10、entToken=ERROR;break;if(save)&(tokenStringIndex=MAXTOKENLEN)tokenStringtokenStringIndex+=(char)c;if(state=DONE)tokenStringtokenStringIndex=0;if(CurrentToken=ID)CurrentToken=ReservedLookUp(tokenString);returnCurrentToken; enumNodeKind/節(jié)點(diǎn)類型FuncK,IntK,IdK,ParamsK,ParamK,CompK,ConstK,CallK,ArgsK,VoidK,V
11、ar_DeclK,Arry_DeclK,Arry_ElemK,AssignK/*,WhileK*/,OpK,Selection_StmtK,Iteration_StmtK,Return_StmtK;struct/節(jié)點(diǎn)類型和字符串關(guān)系stringstr;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
12、,Arry_DeclK,Arry_ElemK,Arry_ElemK,AssignK,AssignK,/*WhileK,WhileK,*/OpK,OpK,Selection_StmtK,Selection_StmtK,Iteration_StmtK,Iteration_StmtK,Return_StmtK,Return_StmtK; struct/符號(hào)與字符串關(guān)系stringstr;TokenTypetk;Ope11=,ASSIGN,=,EQ,GT,=,GEQ,!=,NEQ,=,LEQ; stringOpeLookUp(TokenTypetk)/操作符轉(zhuǎn)換為字符串inti;for(i=0;i11
13、;i+)if(tk=Opei.tk)returnOpei.str; stringChange(NodeKindnk)/節(jié)點(diǎn)類型轉(zhuǎn)換為字符串inti;for(i=0;i19;i+)if(nk=nodekindi.nk)returnnodekindi.str;break; TokenTypetoken;structTreeNodestructTreeNode*child4;structTreeNode*sibling;intlineno;NodeKindnodekind;unionTokenTypeop;intval;constchar*name;attr; TreeNode*declaratio
14、n_list(void);TreeNode*declaration(void);TreeNode*params(void);TreeNode*param_list(TreeNode*p);TreeNode*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);T
15、reeNode*iteration_stmt(void);TreeNode*return_stmt(void);TreeNode*expression(void);TreeNode*var(void);TreeNode*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(ch
16、ar*s)intn;char*t;if(s=NULL)returnNULL;n=strlen(s)+1;t=(char*)malloc(n);if(t=NULL)elsestrcpy(t,s);returnt; voidmatch(TokenTypeexpected)if(token=expected)token=GetToken();elsecoutunexpectedtokenendl; TreeNode*newNode(NodeKindkind)TreeNode*t=(TreeNode*)malloc(sizeof(TreeNode);inti;if(t=NULL);elsefor(i=
17、0;ichildi=NULL;t-sibling=NULL;t-nodekind=kind;t-lineno=lineno;if(kind=OpK|kind=IntK|kind=IdK)if(kind=IdK)=;if(kind=ConstK)t-attr.val=0;returnt; TreeNode*declaration_list(void)/declaration_list-declaration_listdeclaration|declarationTreeNode*t=declaration();TreeNode*p=t;while(token!=INT)&(
18、token!=VOID)&(token!=ENDFILE)token=GetToken();if(token=ENDFILE)break;while(token=INT|token=VOID)TreeNode*q;q=declaration();if(q!=NULL)if(t=NULL)t=p=q;elsep-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;
19、if(token=INT)p=newNode(IntK);match(INT);else/(token=VOID)p=newNode(VoidK);match(VOID); if(p!=NULL&token=ID)q=newNode(IdK);=copyString(tokenString);match(ID);if(token=LPAREN)t=newNode(FuncK);t-child0=p;/p是t子節(jié)點(diǎn)t-child1=q;match(LPAREN);t-child2=params();match(RPAREN);t-child3=compound_stmt()
20、;elseif(token=LBRACKET)t=newNode(Var_DeclK);a=newNode(Arry_DeclK);t-child0=p;/p是t子節(jié)點(diǎn)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;els
21、e;returnt; TreeNode*params(void)/params_list|voidTreeNode*t=newNode(ParamsK);TreeNode*p=NULL;if(token=VOID)p=newNode(VoidK);match(VOID);if(token=RPAREN)if(t!=NULL)t-child0=p;else/參數(shù)列表為(voidid,)t-child0=param_list(p);else/(token=INT)t-child0=param_list(p);returnt; TreeNode*param_list(TreeNode*k)/para
22、ms_list-params_list,param|paramTreeNode*t=param(k);TreeNode*p=t;k=NULL;/沒有要傳給param的VoidK,所以將k設(shè)為NULLwhile(token=COMMA)TreeNode*q=NULL;match(COMMA);q=param(k);if(q!=NULL)if(t=NULL)t=p=q;elsep-sibling=q;p=q;returnt; TreeNode*param(TreeNode*k)TreeNode*t=newNode(ParamK);TreeNode*p=NULL;TreeNode*q=NULL;if
23、(k=NULL&token=VOID)p=newNode(VoidK);match(VOID);elseif(k=NULL&token=INT)p=newNode(IntK);match(INT);elseif(k!=NULL)p=k;if(p!=NULL)t-child0=p;if(token=ID)q=newNode(IdK);=copyString(tokenString);t-child1=q;match(ID);if(token=LBRACKET&(t-child1!=NULL)/match(LBRACKET);t-child2=newNode(IdK);mat
24、ch(RBRACKET);elsereturnt;else;returnt; TreeNode*compound_stmt(void)TreeNode*t=newNode(CompK);match(LBRACE);t-child0=local_declaration();t-child1=statement_list();match(RBRACE);returnt; TreeNode*local_declaration(void)TreeNode*t=NULL;TreeNode*q=NULL;TreeNode*p=NULL;while(token=INT|token=VOID)p=newNod
25、e(Var_DeclK);if(token=INT)TreeNode*q1=newNode(IntK);p-child0=q1;match(INT);elseif(token=VOID)TreeNode*q1=newNode(VoidK);p-child0=q1;match(INT);if(p!=NULL)&(token=ID)TreeNode*q2=newNode(IdK);=copyString(tokenString);p-child1=q2;match(ID);if(token=LBRACKET)TreeNode*q3=newNode(Var_DeclK);p-
26、child3=q3;match(LBRACKET);match(RBRACKET);match(SEMI);elseif(token=SEMI)match(SEMI);elsematch(SEMI); if(p!=NULL)if(t=NULL)t=q=p;elseq-sibling=p;q=p;returnt; TreeNode*statement_list(void)TreeNode*t=statement();TreeNode*p=t;while(IF=token|LBRACKET=token|ID=token|WHILE=token|RETURN=token|SEMI=token|LPA
27、REN=token|NUM=token)TreeNode*q;q=statement();if(q!=NULL)if(t=NULL)t=p=q;elsep-sibling=q;p=q;returnt; TreeNode*statement(void)TreeNode*t=NULL;switch(token)caseIF:t=selection_stmt();break;caseWHILE:t=iteration_stmt();break;caseRETURN:t=return_stmt();break;caseLBRACE:t=compound_stmt();break;caseID:case
28、SEMI:caseLPAREN:caseNUM:t=expression_stmt();break;default:token=GetToken();break;returnt; TreeNode*selection_stmt(void)TreeNode*t=newNode(Selection_StmtK);match(IF);match(LPAREN);if(t!=NULL)t-child0=expression();match(RPAREN);t-child1=statement();if(token=ELSE)match(ELSE);if(t!=NULL)t-child2=stateme
29、nt();returnt; TreeNode*iteration_stmt(void)TreeNode*t=newNode(Iteration_StmtK);match(WHILE);match(LPAREN);if(t!=NULL)t-child0=expression();match(RPAREN);if(t!=NULL)t-child1=statement();returnt; TreeNode*return_stmt(void)TreeNode*t=newNode(Return_StmtK);match(RETURN);if(token=SEMI)match(SEMI);returnt
30、;elseif(t!=NULL)t-child0=expression();match(SEMI);returnt; TreeNode*expression_stmt(void)TreeNode*t=NULL;if(token=SEMI)match(SEMI);returnt;elset=expression();match(SEMI);returnt; TreeNode*expression(void)TreeNode*t=var();if(t=NULL)/不是以ID開頭,只能是simple_expression情況t=simple_expression(t);else/以ID開頭,可能是賦
31、值語句,或simple_expression中的var和call類型的情況TreeNode*p=NULL;if(token=ASSIGN)/賦值語句p=newNode(AssignK);match(ASSIGN);p-child0=t;p-child1=expression();returnp;else/simple_expression中的var和call類型的情況t=simple_expression(t);returnt; TreeNode*var(void)TreeNode*t=NULL;TreeNode*p=NULL;TreeNode*q=NULL;if(token=ID)p=new
32、Node(IdK);=copyString(tokenString);match(ID);if(token=LBRACKET)match(LBRACKET);q=expression();match(RBRACKET); t=newNode(Arry_ElemK);t-child0=p;t-child1=q;elset=p;returnt; TreeNode*simple_expression(TreeNode*k)TreeNode*t=additive_expression(k);k=NULL;if(EQ=token|GT=token|GEQ=token|LT=toke
33、n|LEQ=token|NEQ=token)TreeNode*q=newNode(OpK);q-attr.op=token;q-child0=t;t=q;match(token);t-child1=additive_expression(k);returnt;returnt; TreeNode*additive_expression(TreeNode*k)TreeNode*t=term(k);k=NULL;while(token=PLUS)|(token=MINUS)TreeNode*q=newNode(OpK);q-attr.op=token;q-child0=t;match(token);
34、q-child1=term(k);t=q;returnt; TreeNode*term(TreeNode*k)TreeNode*t=factor(k);k=NULL;while(token=TIMES)|(token=OVER)TreeNode*q=newNode(OpK);q-attr.op=token;q-child0=t;t=q;match(token);q-child1=factor(k);returnt; TreeNode*factor(TreeNode*k)TreeNode*t=NULL;if(k!=NULL)/k為上面?zhèn)飨聛淼囊呀?jīng)解析出來的以ID開頭的var,可能為call或va
35、rif(token=LPAREN&k-nodekind!=Arry_ElemK)/callt=call(k);elset=k;else/沒有從上面?zhèn)飨聛淼膙arswitch(token)caseLPAREN:match(LPAREN);t=expression();match(RPAREN);break;caseID:k=var();if(LPAREN=token&k-nodekind!=Arry_ElemK)t=call(k);else/如果是連續(xù)計(jì)算,進(jìn)入這一步t=k;break;caseNUM:t=newNode(ConstK);if(t!=NULL)&(token=NUM)t-attr
36、.val=atoi(tokenString);match(NUM);break;default:token=GetToken();break;returnt; TreeNode*call(TreeNode*k)TreeNode*t=newNode(CallK);if(k!=NULL)t-child0=k;match(LPAREN);if(token=RPAREN)match(RPAREN);returnt;elseif(k!=NULL)t-child1=args();match(RPAREN);returnt; TreeNode*args(void)TreeNode*t=newNode(ArgsK);TreeNode*s=NULL;TreeNode*p=NULL;if(token!=RPAREN)s=express
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國城市公共汽車客運(yùn)行業(yè)發(fā)展前景及投資規(guī)劃研究報(bào)告版
- 2024-2030年中國地毯行業(yè)競(jìng)爭(zhēng)格局及未來投資趨勢(shì)分析報(bào)告
- 2024-2030年中國國際貨代行業(yè)未來發(fā)展趨勢(shì)及投資風(fēng)險(xiǎn)分析報(bào)告
- 2024年度物聯(lián)網(wǎng)(IoT)設(shè)備控制系統(tǒng)軟件開發(fā)合同技術(shù)集成與擴(kuò)展2篇
- 茂名職業(yè)技術(shù)學(xué)院《國學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年深圳子女撫養(yǎng)權(quán)協(xié)議書樣本3篇
- 中國日?qǐng)?bào)2019年9月25日
- 馬鞍山職業(yè)技術(shù)學(xué)院《美術(shù)基礎(chǔ)與欣賞》2023-2024學(xué)年第一學(xué)期期末試卷
- 呂梁學(xué)院《信息安全綜合》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年度醫(yī)院護(hù)工工作環(huán)境與職業(yè)健康保護(hù)協(xié)議下載3篇
- 焊工工藝學(xué)(A)試卷
- 高級(jí)英語(1)智慧樹知到答案章節(jié)測(cè)試2023年齊魯工業(yè)大學(xué)
- 脫不花三十天溝通訓(xùn)練營
- 機(jī)床操作說明書
- 義務(wù)教育物理課程標(biāo)準(zhǔn)(2022年版)測(cè)試卷(含答案)
- NY/T 396-2000農(nóng)用水源環(huán)境質(zhì)量監(jiān)測(cè)技術(shù)規(guī)范
- GB/T 39901-2021乘用車自動(dòng)緊急制動(dòng)系統(tǒng)(AEBS)性能要求及試驗(yàn)方法
- GB/T 36652-2018TFT混合液晶材料規(guī)范
- 國際商務(wù)談判 袁其剛課件 第四章-國際商務(wù)談判的結(jié)構(gòu)和過程
- 國際商法教案(20092新版)
- 江蘇開放大學(xué)漢語作為第二語言教學(xué)概論期末復(fù)習(xí)題
評(píng)論
0/150
提交評(píng)論