




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、#include<fstream>#include<iostream>#include<string>#include<strstream>using namespace std; #define BUFLEN 256#define MAXLEN 256#define MAXTOKENLEN 40#define MAXCHILDREN 4static int lineno;static int linepos
2、 = 0;/讀取的字符在lineBuf的位置static int EOF_FLAG = false;static int bufsize = 0;/lineBuf的長(zhǎng)度static char lineBufBUFLEN;FILE * source;char tokenStringMAXTOKENLEN+1;string output;/輸出文件 enum TokenTypeENDFILE,ERROR,IF,ELSE,INT,R
3、ETURN,VOID,WHILE,ID,NUM,ASSIGN,EQ,LT,PLUS,MINUS,TIMES,OVER,LPAREN,RPAREN,SEMI,LBRACKET,RBRACKET,LBRACE,RBRACE,COMMA,GT,GEQ,NEQ,LEQ; enum StateTypeSTART,INASSIGN,INCOMMENT,INNUM,INID,DONE,PRECOMMENT,AFTERCOMMENT; structchar* str;TokenType tok;ReserverWords6= "if",I
4、F,"else",ELSE,"int",INT,"return",RETURN,"void",VOID,"while",WHILE void UnGetNextChar()if (!EOF_FLAG)linepos-; int GetNextChar()if(!(linepos<bufsize)lineno+;if(fgets(lineBuf,BUFLEN-1,source)bufsize=strlen(lineBuf);linepos=0;ret
5、urn lineBuflinepos+;elseEOF_FLAG=true;return EOF;elsereturn lineBuflinepos+; TokenType ReservedLookUp(char * s)int i;for (i = 0; i < 6; i+)if(!strcmp(s,ReserverWordsi.str)return ReserverWordsi.tok;return ID; TokenType
6、 GetToken()StateType state = START;/初始狀態(tài)為startbool save;TokenType CurrentToken;int tokenStringIndex=0;string assign=""while(state!=DONE)int c=GetNextChar();save = true;switch (state)case START:if (isdigit(c)state =&
7、#160;INNUM;else if (isalpha(c)state = INID;else if (c = '<')|(c='>')|(c='=')|(c='!')state = INASSIGN;assign+=char(c);else if (c = ' ') | (c = 't')
8、;| (c = 'n')save = false;else if (c = '/')save = false;state = PRECOMMENT;elsestate = DONE;switch (c)case EOF:save = false;CurrentToken = ENDFILE;break;case '+':Curre
9、ntToken = PLUS;break;case '-':CurrentToken = MINUS;break;case '*':CurrentToken = TIMES;break;case '(':CurrentToken = LPAREN;break;case ')':CurrentToken = RPAREN;break;case '':CurrentTok
10、en = SEMI;break;case '':CurrentToken = LBRACKET;break;case '':CurrentToken = RBRACKET;break;case '':CurrentToken = LBRACE;break;case '':CurrentToken = RBRACE;break;case ',':CurrentToken
11、 = COMMA;break;default:CurrentToken = ERROR;break; break;case INCOMMENT:save = false;if (c = EOF)state = DONE;CurrentToken = ENDFILE;else if (c = '*')state = AFTERCOMMEN
12、T;elsestate=INCOMMENT;break;case INASSIGN:if (c = '=')CurrentToken = EQ;state=DONE;else if(assign="!")UnGetNextChar();save = false;CurrentToken = ERROR;state=DONE;else if(assign="=")UnGetNextChar();save =
13、60;false;CurrentToken =ASSIGN state=DONE;else if(assign="<")UnGetNextChar();save = false;CurrentToken =LT state=DONE;elseUnGetNextChar();save = false;CurrentToken =GT state=DONE;break;case INNUM:if (!isdigit(c)UnGetNextCha
14、r();save = false;state = DONE;CurrentToken = NUM;break;case INID:if (!isalpha(c)UnGetNextChar();save = false;state = DONE;CurrentToken = ID;break;case PRECOMMENT:if(c='*')state=INCOMMENT;save=false;elseUnGetNextChar()
15、;CurrentToken=OVER;state=DONE;break;case AFTERCOMMENT:save=false;if(c='/')state=START;else if(c='*')state=AFTERCOMMENT;elsestate=INCOMMENT;break;case DONE:default:state = DONE;CurrentToken = ERROR;break;if(save)&&(tokenStringIndex<=MAXTOK
16、ENLEN)tokenStringtokenStringIndex+=(char)c;if(state=DONE)tokenStringtokenStringIndex='0'if(CurrentToken=ID)CurrentToken=ReservedLookUp(tokenString);return CurrentToken; enum NodeKind/節(jié)點(diǎn)類型FuncK,IntK,IdK,ParamsK,ParamK,CompK,ConstK,CallK,ArgsK,VoidK,Var_DeclK,Arry_DeclK,Arry_ElemK,As
17、signK/*,WhileK*/,OpK,Selection_StmtK,Iteration_StmtK,Return_StmtK; struct/節(jié)點(diǎn)類型和字符串關(guān)系string str;NodeKind nk;nodekind18= "Funck",FuncK,"IntK",IntK,"IdK",IdK,"ParamsK",ParamsK,"ParamK",ParamK,"CompK",CompK,"Const
18、K",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",Selecti
19、on_StmtK,"Iteration_StmtK",Iteration_StmtK,"Return_StmtK",Return_StmtK; struct/符號(hào)與字符串關(guān)系string str;TokenType tk;Ope11= "=",ASSIGN,"=",EQ,"<",LT,"+",PLUS,"-",MINUS,"*",TIMES,"/",OVER,"
20、;>",GT,">=",GEQ,"!=",NEQ,"<=",LEQ; string OpeLookUp(TokenType tk)/操作符轉(zhuǎn)換為字符串int i;for(i=0;i<11;i+)if(tk=Opei.tk)return Opei.str; string Change(NodeKind nk)/節(jié)點(diǎn)類型轉(zhuǎn)換為字符串int i;for(i=0;i<19;i+)if(nk=nodekindi.nk)return
21、60;nodekindi.str;break; TokenType token;struct TreeNodestruct TreeNode * child4;struct TreeNode * sibling;int lineno; NodeKind nodekind;union TokenType op; int val; const char
22、0;* name; attr; TreeNode * declaration_list(void);TreeNode * declaration(void);TreeNode * params(void);TreeNode * param_list(TreeNode * p);TreeNode * param(TreeNode * p);TreeNode * compound_stmt(void);TreeNode&
23、#160;* 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 *
24、0;expression(void);TreeNode * var(void);TreeNode * simple_expression(TreeNode * p);TreeNode * additive_expression(TreeNode * p);TreeNode * term(TreeNode * p);TreeNode * factor(TreeNode * p);TreeNode *
25、;call(TreeNode * p);TreeNode * args(void); char * copyString(char *s)int n;char * t;if (s=NULL)return NULL;n=strlen(s)+1;t=(char*)malloc(n);if (t=NULL)elsestrcpy(t,s);return t; void match(TokenType expected)if(token=expe
26、cted)token=GetToken();elsecout<<"unexpected token"<<endl; TreeNode * newNode(NodeKind kind) TreeNode * t = (TreeNode *) malloc(sizeof(TreeNode);int i;if (t=NULL);else for (i=0;i<4;i+) t->child
27、i = NULL; t->sibling = NULL; t->nodekind = kind; t->lineno = lineno;if (kind=OpK|kind=IntK|kind=IdK)if(kind=IdK)t-> = ""i
28、f(kind=ConstK)t->attr.val = 0;return t; TreeNode * declaration_list(void)/declaration_list->declaration_list declaration | declarationTreeNode * t = declaration();TreeNode * p =t; while(token!=INT)&&(token!
29、=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);return
30、t; 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=V
31、OID)p=newNode(VoidK);match(VOID); if(p!=NULL&&token=ID)q = newNode(IdK);q-> = copyString(tokenString); match(ID);if (token=LPAREN)t = newNode(FuncK);t->child0 = p; /p是t子節(jié)點(diǎn)t->child1 = q;match(LPAREN
32、);t->child2 = params();match(RPAREN);t->child3 = compound_stmt();else if (token=LBRACKET)t = newNode(Var_DeclK);a = newNode(Arry_DeclK);t->child0 = p; /p是t子節(jié)點(diǎn)t->child1 = a;match(LBRACKET);s =
33、;newNode(ConstK);s->attr.val = atoi(tokenString);match(NUM);a->child0=q;a->child1=s;match(RBRACKET);match(SEMI);else if (token=SEMI)t = newNode(Var_DeclK);t->child0 = p;t->child1 = q;match(SEMI);else;else;return t; TreeNode *
34、 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ù)列表為(void id,) t-&
35、gt;child0 = param_list(p);else/(token=INT)t->child0 = param_list(p);return t; TreeNode * param_list(TreeNode * k)/params_list->params_list,param | paramTreeNode * t = param(k);TreeNode * p = t;
36、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;return t; TreeNode * param(TreeNode * k)T
37、reeNode * t = newNode(ParamK);TreeNode * p = NULL;TreeNode * q = NULL;if(k=NULL&&token=VOID)p = newNode(VoidK);match(VOID);else if(k=NULL&&token=INT)p = newNode(IntK);match(INT);else if (k!
38、=NULL)p = k;if(p!=NULL)t->child0 = p;if (token=ID)q = newNode(IdK);q-> = copyString(tokenString);t->child1 = q;match(ID);if (token=LBRACKET&&(t->child1!=NULL)/match(LBRACKET);t->child2 = newNode(IdK
39、);match(RBRACKET);else return t; else return t; TreeNode * compound_stmt(void) TreeNode * t = newNode(CompK);match(LBRACE);t->child0 = local_declaration();t->child1 = statement_list(); match(
40、RBRACE);return t; TreeNode * local_declaration(void) TreeNode * t = NULL;TreeNode * q = NULL;TreeNode * p = NULL;while(token=INT | token=VOID) p = newNode(Var_DeclK);if(token=INT)TreeNode
41、160;* q1 = newNode(IntK);p->child0 = q1;match(INT);else if(token=VOID)TreeNode * q1 = newNode(VoidK);p->child0 = q1;match(INT);if(p!=NULL)&&(token=ID) TreeNode * q2 = newNode(IdK);
42、60; q2-> = copyString(tokenString);p->child1 = q2;match(ID);if(token=LBRACKET) TreeNode * q3 = newNode(Var_DeclK);p->child3 = q3;match(LBRACKET);match(RBRACKET);match(SEMI);else if(token=SEMI)match(SEMI);elsematch(SEM
43、I); if(p!=NULL)if(t=NULL)t = q = p;elseq->sibling = p;q = p;return t; TreeNode * statement_list(void) TreeNode * t = statement(); TreeNode * p = t;while (IF=token&
44、#160;| LBRACKET=token | ID=token | WHILE=token | RETURN =token | SEMI=token | LPAREN=token | NUM=token) TreeNode * q;q = statement();if(q!=NULL)if(t=NULL) t = p =
45、;q;else p->sibling = q;p = q;return t; TreeNode * statement(void) TreeNode * t = NULL;switch(token)case IF:t = selection_stmt(); break;case WHILE:t = iteration_stmt(); break;case
46、160;RETURN:t = return_stmt(); break;case LBRACE:t = compound_stmt(); break;case ID: case SEMI: case LPAREN: case NUM: t = expression_stmt(); break;default:token = GetToken();break;return t; TreeN
47、ode * 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->c
48、hild2 = statement();return t; 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
49、;= statement();return t; TreeNode * return_stmt(void) TreeNode * t = newNode(Return_StmtK);match(RETURN);if (token=SEMI) match(SEMI);return t;else if(t!=NULL) t->child0 = expression(); match(SEM
50、I);return t; TreeNode * expression_stmt(void) TreeNode * t = NULL;if(token=SEMI) match(SEMI);return t;else t = expression();match(SEMI);return t; TreeNode * expression(void) TreeNode *
51、160;t = var();if(t=NULL)/不是以ID開頭,只能是simple_expression情況 t = simple_expression(t); else/以ID開頭,可能是賦值語(yǔ)句,或simple_expression中的var和call類型的情況 TreeNode * p = NULL;if(token=ASSIGN)/賦值語(yǔ)句 p = newNode(AssignK);match(ASSIGN);
52、p->child0 = t;p->child1 = expression();return p;else /simple_expression中的var和call類型的情況 t = simple_expression(t); return t; TreeNode * var(void) TreeNode * t = NULL;TreeNode * p
53、 = NULL;TreeNode * q = NULL;if(token=ID)p = newNode(IdK);p-> = copyString(tokenString); match(ID);if(token=LBRACKET) match(LBRACKET);q = expression();match(RBRACKET); t = newNode(Arry_ElemK);t->child
54、0 = p;t->child1 = q;elset = p;return t; TreeNode * simple_expression(TreeNode * k) TreeNode * t = additive_expression(k);k = NULL;if(EQ=token | GT=token | GEQ=token |
55、0;LT=token | LEQ=token | NEQ=token) TreeNode * q = newNode(OpK);q->attr.op = token; q->child0 = t;t = q;match(token);t->child1 = additive_expression(k); return t;return t; TreeNode
56、 * 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);q
57、->child1 = term(k);t = q;return t; TreeNode * term(TreeNode * k) TreeNode * t = factor(k);k = NULL;while(token=TIMES)|(token=OVER) TreeNode * q = newNode(OpK);q->attr.op = t
58、oken; q->child0 = t; t = q;match(token);q->child1 = factor(k);return t; TreeNode * factor(TreeNode * k) TreeNode * t = NULL;if(k!=NULL)/k為上面?zhèn)飨聛?lái)的已經(jīng)解析出來(lái)的以ID開頭的var,可能為call或varif(token=LPAREN &
59、& k->nodekind!=Arry_ElemK) /call t = call(k);else t = k; else/沒有從上面?zhèn)飨聛?lái)的var switch(token)case LPAREN:match(LPAREN);t = expression();match(RPAREN);break;case ID:k = var();if(LPAREN=token && k
60、->nodekind!=Arry_ElemK) t = call(k);else/如果是連續(xù)計(jì)算,進(jìn)入這一步t=k;break;case NUM:t = newNode(ConstK);if(t!=NULL)&&(token=NUM) t->attr.val = atoi(tokenString); match(NUM);break;default:token = GetToken();break; return t
61、; TreeNode * call(TreeNode * k) TreeNode * t = newNode(CallK);if(k!=NULL)t->child0 = k;match(LPAREN);if(token=RPAREN) match(RPAREN);return t;else if(k!=NULL) t->child1 = args();match(RP
62、AREN);return t; TreeNode * args(void) TreeNode * t = newNode(ArgsK);TreeNode * s = NULL;TreeNode * p = NULL;if(token!=RPAREN)s = expression();p = s;while(token=COMMA) TreeNode
63、160;* q;match(COMMA);q = expression();if(q!=NULL)if(s=NULL) s = p = q;else p->sibling = q;p = q;if(s!=NULL)t->child0 = s;return t; int blank_number=0;void PreOrder(TreeNode* t)strin
64、g blank=" "int i;for(i=0;i<blank_number;i+)blank+=" "if(t!=NULL)if(t->nodekind=OpK)cout<<blank<<"Op: "<<OpeLookUp(t->attr.op)<<endl;output+=blank+"Op: "+OpeLookUp(t->attr.op)+"n"else if(t->nodekind=IdK)cout<<blank<<Change(t->nodekind)<<": "<<t-><<endl;output+=blank+Change(t->nodekind)+": "+t->+"n"else if(t->nodekin
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全生產(chǎn)管理制度文本普通貨運(yùn)十七項(xiàng)
- 汽車金融公司風(fēng)險(xiǎn)防范與應(yīng)對(duì)措施考核試卷
- 火工品生產(chǎn)過程中的質(zhì)量控制與保障考核試卷
- 燈具銷售中的市場(chǎng)預(yù)測(cè)與趨勢(shì)分析考核試卷
- 抗磨損能力研究考核試卷
- 生物遺傳工程與生物技術(shù)考核試卷
- 電池管理系統(tǒng)與充電技術(shù)考核試卷
- 2025屆四川省德陽(yáng)市第五中學(xué)高三下學(xué)期第三次(線上)周考數(shù)學(xué)試題
- 2025醫(yī)療設(shè)備采購(gòu)合同協(xié)議范本格式
- 2025版鍋爐設(shè)備購(gòu)銷安裝合同(草案)
- 醫(yī)保業(yè)務(wù)培訓(xùn)大綱
- 北師大版2024-2025學(xué)年度第二學(xué)期一年級(jí)數(shù)學(xué)期中檢測(cè)(含答案)
- 2025年中國(guó)短圓柱滾子軸承市場(chǎng)調(diào)查研究報(bào)告
- 教師的情緒管理課件
- 湖北省十一校2024-2025學(xué)年高三第二次聯(lián)考數(shù)學(xué)試卷(解析版)
- 英語(yǔ)-華大新高考聯(lián)盟2025屆高三3月教學(xué)質(zhì)量測(cè)評(píng)試題+答案
- 第10課 養(yǎng)成遵紀(jì)守法好習(xí)慣
- 《手工制作》課件-幼兒園掛飾
- 【初中地理】西亞+課件-2024-2025學(xué)年人教版地理七年級(jí)下冊(cè)
- 2025修訂版《保障中小企業(yè)款項(xiàng)支付條例》解讀學(xué)習(xí)課件
- 鼓勵(lì)員工發(fā)現(xiàn)安全隱患的獎(jiǎng)勵(lì)制度
評(píng)論
0/150
提交評(píng)論