![四川大學(xué)-C-minus語(yǔ)法分析器-純代碼_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/9/f30c9279-8316-4cc2-a1ae-e8cda46df6ed/f30c9279-8316-4cc2-a1ae-e8cda46df6ed1.gif)
![四川大學(xué)-C-minus語(yǔ)法分析器-純代碼_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/9/f30c9279-8316-4cc2-a1ae-e8cda46df6ed/f30c9279-8316-4cc2-a1ae-e8cda46df6ed2.gif)
![四川大學(xué)-C-minus語(yǔ)法分析器-純代碼_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/9/f30c9279-8316-4cc2-a1ae-e8cda46df6ed/f30c9279-8316-4cc2-a1ae-e8cda46df6ed3.gif)
![四川大學(xué)-C-minus語(yǔ)法分析器-純代碼_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/9/f30c9279-8316-4cc2-a1ae-e8cda46df6ed/f30c9279-8316-4cc2-a1ae-e8cda46df6ed4.gif)
![四川大學(xué)-C-minus語(yǔ)法分析器-純代碼_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/9/f30c9279-8316-4cc2-a1ae-e8cda46df6ed/f30c9279-8316-4cc2-a1ae-e8cda46df6ed5.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(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;/沒(méi)有要傳給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開(kāi)頭,只能是simple_expression情況 t = simple_expression(t); else/以ID開(kāi)頭,可能是賦值語(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開(kāi)頭的var,可能為call或varif(token=LPAREN &
59、& k->nodekind!=Arry_ElemK) /call t = call(k);else t = k; else/沒(méi)有從上面?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ú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- LY/T 2280-2024中國(guó)森林認(rèn)證森林經(jīng)營(yíng)應(yīng)用指南
- 蘇科版版數(shù)學(xué)七年級(jí)上冊(cè)聽(tīng)評(píng)課記錄《2-7 有理數(shù)的乘方》第1課時(shí)
- 人教部編版八年級(jí)道德與法治上冊(cè):8.2《堅(jiān)持國(guó)家利益至上》聽(tīng)課評(píng)課記錄3
- 蘇科版九年級(jí)數(shù)學(xué)聽(tīng)評(píng)課記錄:第27講 切線性質(zhì)定理的應(yīng)用
- 用工合同范本(2篇)
- 生態(tài)環(huán)境融資協(xié)議書(shū)(2篇)
- 環(huán)境友好化學(xué)品研發(fā)合同(2篇)
- 一年級(jí)下雪啦聽(tīng)評(píng)課記錄
- 六年級(jí)數(shù)學(xué)上聽(tīng)評(píng)課記錄
- 人教版數(shù)學(xué)八年級(jí)下冊(cè)《構(gòu)建知識(shí)體系》聽(tīng)評(píng)課記錄2
- 2025年大慶職業(yè)學(xué)院高職單招語(yǔ)文2018-2024歷年參考題庫(kù)頻考點(diǎn)含答案解析
- 2025年中國(guó)南方航空股份有限公司招聘筆試參考題庫(kù)含答案解析
- 商務(wù)部發(fā)布《中國(guó)再生資源回收行業(yè)發(fā)展報(bào)告(2024)》
- 山東省濟(jì)南市2024-2024學(xué)年高三上學(xué)期1月期末考試 地理 含答案
- 2025年福建新華發(fā)行(集團(tuán))限責(zé)任公司校園招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 【課件】液體的壓強(qiáng)(課件)-2024-2025學(xué)年人教版物理八年級(jí)下冊(cè)
- 實(shí)施彈性退休制度暫行辦法解讀課件
- 冷凍食品配送售后服務(wù)體系方案
- 江蘇省駕??荚嚳颇恳豢荚囶}庫(kù)
- 四川省成都市青羊區(qū)成都市石室聯(lián)合中學(xué)2023-2024學(xué)年七上期末數(shù)學(xué)試題(解析版)
- 2024-2030年中國(guó)自動(dòng)光學(xué)檢測(cè)儀(AOI)市場(chǎng)競(jìng)爭(zhēng)格局與前景發(fā)展策略分析報(bào)告
評(píng)論
0/150
提交評(píng)論