版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 編譯原理課程設(shè)計</b></p><p> 題 目 語法分析器</p><p> 學(xué)生姓名 </p><p><b> 學(xué)號 </b></p><p> 學(xué) 院 </p><
2、p> 專 業(yè) 軟件工程</p><p> 指導(dǎo)教師 </p><p> 二O一三 年 一月 十日</p><p><b> 目 錄</b></p><p><b> 1 系統(tǒng)目標(biāo)1</b></p><p> 1.1 要
3、求介紹1</p><p> 1.2 功能要求1</p><p> 2 邏輯設(shè)計過程4</p><p><b> 3 系統(tǒng)展示4</b></p><p><b> 4 系統(tǒng)實現(xiàn)6</b></p><p> 4.1詞法分析的實現(xiàn)6</p>&l
4、t;p> 4.2語法分析的實現(xiàn)13</p><p><b> 1 系統(tǒng)目標(biāo)</b></p><p><b> 1.1 要求介紹</b></p><p> 課程設(shè)計所用的Tiny文法:</p><p> Program → stmt-sequence </p><
5、p> stmt-sequence →stmt-sequence ;statement | statement </p><p> statement → if-stmt | repeat-stmt | assign-stmt | read-stmt | write-stmt </p><p> if-stmt →if exp then stmt-sequence end <
6、;/p><p> | if exp then stmt-sequence else stmt-sequence end </p><p> repeat-stmt → repeat stmt-sequence until exp </p><p> assign-stmt →identifier := exp </p><p> rea
7、d-stmt → read identifier </p><p> write-stmt → write exp </p><p> exp→ simple-exp comparison-op simple-exp | simple-exp </p><p> simple-exp → simple-exp addop term | term <
8、/p><p> comparison-op →<|= addop→+|- mulop→*|/ </p><p> term → term mulop factor | factor </p><p> factor →( exp ) | number | identifier</p><p> Tiny語言關(guān)鍵字表:<
9、;/p><p> 其他: 標(biāo)志符: identifier 種別碼: 21 助記符: $ID </p><p> 數(shù) 字 : number 種別碼: 22 助記符:
10、 $NUMBER</p><p><b> 1.2 功能要求</b></p><p> 根據(jù)Tiny文法的要求,能夠?qū)φZ句進(jìn)行詞法分析,當(dāng)詞法分析正確時能夠進(jìn)行語法分析,生成語法樹,當(dāng)語法發(fā)生錯誤時能夠進(jìn)行報錯。</p><p><b> 邏輯設(shè)計過程</b></p><p> 2-1 軟件
11、總體結(jié)構(gòu)</p><p> 本軟件包括下面3個功能模塊:詞法分析功能模塊;語法分析功能模塊;輸出模塊。</p><p> 2-2Tiny語言語法圖如下:</p><p><b> 2-3總體思路</b></p><p> 在實現(xiàn)之前首先實現(xiàn)EBNF,消除左遞歸和左因子,為遞歸下降程序做好準(zhǔn)備。</p>
12、<p> 對于語句和表達(dá)式采用枚舉的形式定義,形成一個統(tǒng)一的樹結(jié)點結(jié)構(gòu)。</p><p> 把正確源程序的首先經(jīng)過詞法分析形成二元式記號提供給語法分析程序。</p><p> 如果出現(xiàn)錯誤,指出錯誤的位置和類型。</p><p> 把語法樹按照樹的前序遍歷的形式把所有的結(jié)點按照某種形式輸出。</p><p> 2-4T
13、iny語法樹結(jié)構(gòu)</p><p> Tiny編輯器的語法樹結(jié)構(gòu):</p><p><b> 系統(tǒng)展示</b></p><p><b> Tiny代碼例子:</b></p><p><b> 詞法分析的結(jié)果:</b></p><p><b&g
14、t; 語法分析的結(jié)果:</b></p><p><b> 發(fā)生錯誤時:</b></p><p><b> Tiny代碼例子:</b></p><p><b> 分析結(jié)果:</b></p><p><b> 4.系統(tǒng)實現(xiàn)</b><
15、/p><p> 進(jìn)行詞法分析的部分代碼:</p><p> void CiFa::back() //后退一個字節(jié)</p><p><b> {</b></p><p> if (cur != 0) //當(dāng)前在處理區(qū)中的位置</p><p><
16、;b> cur--;</b></p><p><b> }</b></p><p> void CiFa::forward() //讀取一個字節(jié)</p><p><b> {</b></p><p> if (cur == 999)</p>&
17、lt;p><b> {</b></p><p> readFile();</p><p><b> cur = 0;</b></p><p><b> }else{</b></p><p><b> cur++;</b></p>
18、<p><b> }</b></p><p><b> }</b></p><p> void CiFa::distinguish() //識別一個單詞</p><p><b> {</b></p><p> char temp[20];</
19、p><p> memset(temp, 0, 20);</p><p><b> char ch;</b></p><p> int i = 0;</p><p> ch = buffer[cur];</p><p> bool match = false;</p><p
20、> if(isalpha(ch)) //識別變量和保留字 isalpha判斷ch是否為英文字符 </p><p><b> {</b></p><p> temp[i] = ch;</p><p> this->f
21、orward();</p><p> ch = buffer[cur];</p><p> while (isalpha(ch)||isalnum(ch)) //判斷是否為數(shù)字或字符</p><p><b> {</b></p><p><b> i++;</b>&l
22、t;/p><p> temp[i] = ch;</p><p> this->forward();</p><p> ch = buffer[cur];</p><p><b> }</b></p><p> this->back();</p><p>&
23、lt;b> i++;</b></p><p> temp[i] = '\0';</p><p> for(int n = 0; n < 8; n++ )</p><p> if (strcmp(temp, r[n].key) == 0)</p><p><b> {</b>
24、;</p><p> match = true;</p><p> makeWord(n,temp);</p><p><b> break;</b></p><p><b> }</b></p><p> if (match != true)</p>
25、<p><b> {</b></p><p> makeWord(21,temp);</p><p><b> }</b></p><p> }else if (isdigit(ch)) //識別數(shù)字</p><p><
26、b> {</b></p><p> temp[i] = ch;</p><p> this->forward();</p><p> ch = buffer[cur];</p><p> while(isdigit(ch))</p><p><b> {</b>
27、</p><p><b> i++;</b></p><p> temp[i] = ch;</p><p> this->forward();</p><p> ch = buffer[cur];</p><p><b> }</b></p>&
28、lt;p> this->back();</p><p><b> i++;</b></p><p> temp[i] = '\0';</p><p> makeWord(22,temp);</p><p> }else if (ch == '+' || ch == &
29、#39;-' || ch == '*' || ch == '/' || ch == '=' || ch == '<' ) //識別算符</p><p><b> {</b></p><p> switch(ch)</p><p><b> {<
30、;/b></p><p> case '+': makeWord(8,"+");break;</p><p> case '-': makeWord(9,"-");break;</p><p> case '*':makeWord(10,"*");
31、break;</p><p> case '/':makeWord(11,"/");break;</p><p> case '=':makeWord(12,"=");break;</p><p> case '<':makeWord(13,"<&qu
32、ot;);break;</p><p><b> }</b></p><p> }else if(ch == ':')</p><p><b> {</b></p><p> this->forward();</p><p> ch = buf
33、fer[cur];</p><p> if (ch == '=')</p><p><b> {</b></p><p> makeWord(14,":=");</p><p><b> }else{</b></p><p> E
34、rror("非法符號");//出錯 非法符號</p><p><b> }</b></p><p> }else if (ch == '(')</p><p><b> {</b></p><p> push('(');</p>
35、<p> makeWord(16,"(");</p><p> }else if ( ch == ')')</p><p><b> {</b></p><p> if (isMatch(')'))</p><p><b> {<
36、/b></p><p> makeWord(17,")");</p><p><b> }</b></p><p><b> }</b></p><p> else if( ch == '{'){</p><p> push
37、('{');</p><p> ls = new struct word;</p><p> ls->id = length;</p><p> ls->line = line;</p><p> ls->type = 18;</p><p> strcpy(ls->c
38、ontent, "{");</p><p> ls->next = NULL;</p><p> if(head == NULL)</p><p><b> {</b></p><p><b> le = ls;</b></p><p>
39、head = le;</p><p><b> }else</b></p><p> le->next = ls;</p><p><b> le = ls;</b></p><p><b> length++;</b></p><p>
40、 }else if ( ch == '}')</p><p><b> {</b></p><p> if (isMatch('}')) //已做錯誤處理</p><p><b> {</b></p><p> makeW
41、ord(17,"}");</p><p><b> }</b></p><p> }else if ( ch == '#' )</p><p><b> {</b></p><p> makeWord(20,"#");</p>
42、;<p> }else if ( ch == ';')</p><p><b> {</b></p><p> makeWord(15,";");</p><p><b> }</b></p><p> else if ( ch ==
43、39; ' || ch == '\t' || ch == '\r' || ch == '\f')</p><p><b> {</b></p><p> }else if( ch == '\n' )</p><p><b> {</b></
44、p><p> this->line++;</p><p><b> }else{</b></p><p> Error("非法符號");</p><p><b> }</b></p><p><b> }</b></
45、p><p> void CiFa::shapeWord(int type, char *content ) //構(gòu)造單詞</p><p><b> {</b></p><p> ls = new struct word;</p><p> ls->id = length;</p><
46、p> ls->line = line;</p><p> ls->type = type;</p><p> strcpy(ls->content, content);</p><p> ls->next = NULL;</p><p> if(head == NULL)</p><
47、p><b> {</b></p><p><b> le = ls;</b></p><p> head = le;</p><p><b> }else</b></p><p> le->next = ls;</p><p>&l
48、t;b> le = ls;</b></p><p><b> length++;</b></p><p><b> }</b></p><p> void CiFa::Error(char *content) //錯誤的定位</p><p><b> {
49、</b></p><p> els = new struct error;</p><p> els->id = elength;</p><p> els->line = line;</p><p> strcpy(els->reason, content);</p><p>
50、 els->next = NULL;</p><p> if(ehead == NULL)</p><p><b> {</b></p><p> ele = els;</p><p> ehead = ele;</p><p><b> }else</b>&
51、lt;/p><p> ele->next = els;</p><p> ele = els;</p><p> elength++;</p><p><b> }</b></p><p> struct word* CiFa::getWord() //獲得單詞</p&g
52、t;<p><b> {</b></p><p> return this->head;</p><p><b> }</b></p><p> bool CiFa::hasError() //看是否有錯誤</p><p><b> {</b
53、></p><p> if (ehead ==NULL)</p><p><b> {</b></p><p> return false;</p><p><b> }else{</b></p><p> return true;</p>&l
54、t;p><b> }</b></p><p><b> }</b></p><p> 進(jìn)行語法分析的部分代碼:</p><p> mytiny::mytiny(struct word* head)</p><p><b> {</b></p>&l
55、t;p> this->head = head; //代入</p><p> start = 0;</p><p> end = getNum();</p><p><b> cur = 0;</b></p><p> this->print = false;<
56、;/p><p><b> //常量</b></p><p> printf("\n\n\n語法分析開始\n:....................");</p><p> this->phead = this->program();</p><p> if (phead != NUL
57、L)</p><p><b> {</b></p><p> //printf("\n%s\n",phead->date);</p><p> show(phead,0);</p><p><b> }</b></p><p> pri
58、ntf("\n語法分析結(jié)束\n:........................");</p><p><b> }</b></p><p> struct yufatree* mytiny::program()</p><p><b> {</b></p><p> s
59、truct yufatree* p;</p><p> p = new struct yufatree;</p><p> if (cur<end)</p><p><b> {</b></p><p> int type = head->type; //每個單詞的總
60、類</p><p> if (type == 0||type == 4||type == 6||type == 7||type == 21)</p><p><b> {</b></p><p> p->date = "Program";</p><p> initLeaves(p);
61、</p><p> p->leave[0] = stmt_sequence();</p><p><b> return p;</b></p><p><b> }else {</b></p><p> printf("程序不接受參數(shù)(行數(shù):%3d):%5s\t!\n&quo
62、t;,head->line,head->content);</p><p><b> exit(0);</b></p><p><b> }</b></p><p><b> }else{</b></p><p> return NULL;</p>
63、;<p><b> }</b></p><p><b> }</b></p><p> struct yufatree* mytiny::stmt_sequence()</p><p><b> {</b></p><p> struct yufatre
64、e* p;</p><p> p = new struct yufatree;</p><p> p->date = "stmt-sequence";</p><p> this->initLeaves(p);</p><p> if (cur<end)</p><p>&
65、lt;b> {</b></p><p> int type = getWord(cur)->type;</p><p> if (type == IF|| type == REPEAT|| type==IDENTIFIER||type == READ||type == WRITE)</p><p><b> {</b&
66、gt;</p><p> p->leave[0] = statement();</p><p> p->leave[1] = stmt_sequence2();</p><p> if (cur<end)</p><p><b> {</b></p><p> type
67、 = getWord(cur)->type;</p><p> if (type == 15||type == END|| type == ELSE ||type == UNTIL)</p><p><b> {</b></p><p><b> return p;</b></p><p&
68、gt;<b> }else{</b></p><p> printf("error");</p><p><b> exit(0);</b></p><p><b> }</b></p><p><b> }else{</b>
69、</p><p><b> return p;</b></p><p><b> }</b></p><p><b> }else{</b></p><p> printf("error");</p><p><b&
70、gt; exit(0);</b></p><p><b> } </b></p><p><b> }else{</b></p><p> printf("stmt_sequence");</p><p><b> exit(0);</b&g
71、t;</p><p><b> }</b></p><p><b> }</b></p><p> struct yufatree* mytiny::stmt_sequence2()</p><p><b> {</b></p><p> st
72、ruct yufatree* p;</p><p> p = new struct yufatree;</p><p> p->date = "stmt-sequence2";</p><p> initLeaves(p);</p><p> if (cur < end)</p><
73、p><b> {</b></p><p> if (getWord(cur)->type == 15)</p><p><b> {</b></p><p> p->leave[0] = saveTerminal();</p><p> p->leave[1] =
74、statement();</p><p> p->leave[2] = stmt_sequence2();</p><p> if (cur<end)</p><p><b> {</b></p><p> int type = getWord(cur)->type;</p>&l
75、t;p> if (type != 15)</p><p><b> {</b></p><p> printf("error");</p><p><b> exit(0);</b></p><p><b> }</b></p>
76、<p><b> }else{</b></p><p><b> return p;</b></p><p><b> }</b></p><p> }else{ //stmt-sequence->ko
77、ng</p><p> return NULL;</p><p><b> }</b></p><p><b> }else</b></p><p> return NULL;</p><p><b> }</b></p><
78、;p> struct yufatree* mytiny::statement()</p><p><b> {</b></p><p> struct yufatree* p;</p><p> p = new struct yufatree;</p><p> p->date = "st
79、atement";</p><p> this->initLeaves(p);</p><p> if (cur < end)</p><p><b> {</b></p><p> int type = getWord(cur)->type;</p><p>
80、 switch(type)</p><p><b> {</b></p><p><b> //if-stmt</b></p><p> case 0:p->leave[0] = if_stmt();break;</p><p> //repeat-stmt</p>
81、<p> case 4:p->leave[0] = repeat_stmt();break;</p><p> //read-stmt</p><p> case 6:p->leave[0] = read_stmt();break;</p><p> //write-stmt</p><p> case 7:p
82、->leave[0] = write_stmt();break;</p><p> //assign-stmt</p><p> case 21:p->leave[0] =assign_stmt();break;</p><p> case 15:return p;</p><p> default:return NU
83、LL;</p><p><b> }</b></p><p><b> return p;</b></p><p><b> }else{</b></p><p> printf("statement ");</p><p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 編譯原理課程設(shè)計---語法分析器
- 編譯原理課程設(shè)計--語法分析器
- 編譯原理語法分析器課程設(shè)計
- 編譯原理詞法分析器語法分析課程設(shè)計
- 編譯原理課程設(shè)計(c++)-語法分析器
- 語法分析課程設(shè)計---編譯原理語法分析器的設(shè)計與實現(xiàn)
- 編譯原理課程設(shè)計-詞法語法分析器
- 編譯原理課程設(shè)計--表達(dá)式語法分析器
- 編譯原理課程設(shè)計--pascal語言詞法、語法分析器設(shè)計
- 編譯原理課程設(shè)計--構(gòu)造lr(0)分析法語法分析器
- 課程設(shè)計----編譯原理詞法分析器
- c-minus詞法分析和語法分析設(shè)計編譯器編譯原理課程設(shè)計
- 編譯課程設(shè)計-遞歸下降語法分析
- 編譯原理課程設(shè)計詞法分析器文檔
- 編譯原理課程設(shè)計報告詞法分析器
- 編譯原理課程設(shè)計--c-編譯器詞法分析與語法分析的實現(xiàn)
- 編譯原理語法分析
- 編譯原理課程設(shè)計報告之詞法分析器
- 編譯原理課程設(shè)計---ll(1)遞歸下降分析器
- 編譯原理課程設(shè)計-lr分析器總控程序的實現(xiàn)
評論
0/150
提交評論