版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 課 程 設(shè) 計(jì) 報(bào) 告</p><p> 課程設(shè)計(jì)名稱(chēng): 編譯技術(shù) </p><p> 系 : 三 系 </p><p> 學(xué)生姓名: 王 輝 </p><p> 班 級(jí): 09軟件(1)班 </p><p> 學(xué) 號(hào):
2、 </p><p> 成 績(jī): </p><p> 指導(dǎo)教師: </p><p> 開(kāi)課時(shí)間: 2011-2012 學(xué)年 2 學(xué)期</p><p><b> 目錄</b></p><p><
3、;b> 一.設(shè)計(jì)題目1</b></p><p><b> 二.主要內(nèi)容1</b></p><p><b> 三.具體要求1</b></p><p><b> 四.進(jìn)度安排2</b></p><p><b> 五.成績(jī)?cè)u(píng)定2<
4、/b></p><p><b> 六.設(shè)計(jì)思路3</b></p><p><b> 1.詞法分析3</b></p><p> ?。?)單詞符號(hào)及種別表3</p><p> 2.SLR的分析表:4</p><p> 1). 算術(shù)表達(dá)式的SLR(1)分析表:
5、4</p><p> 2). 布爾表達(dá)式的SLR分析表:4</p><p> 3). 程序語(yǔ)句的SLR分析表:6</p><p> 七.源程序及運(yùn)行結(jié)果7</p><p><b> 1)源代碼:7</b></p><p><b> 2)運(yùn)行截圖28</b>
6、;</p><p><b> 八.心得體會(huì)31</b></p><p><b> 一.設(shè)計(jì)題目</b></p><p> 小型程序設(shè)計(jì)語(yǔ)言編譯器的設(shè)計(jì)與實(shí)現(xiàn)</p><p><b> 二.主要內(nèi)容</b></p><p> 自定義一種簡(jiǎn)單的小
7、型高機(jī)程序設(shè)計(jì)語(yǔ)言,采用任意一種編程語(yǔ)言和編程工具設(shè)計(jì)并實(shí)現(xiàn)其編譯器,展示編譯系統(tǒng)中詞法分析和語(yǔ)法分析的全過(guò)程。</p><p><b> 三.具體要求</b></p><p> 1、對(duì)單詞的構(gòu)詞規(guī)則有明確的定義;</p><p> 2、編寫(xiě)的詞法分析程序能夠正確識(shí)別源程序中的單詞符號(hào);</p><p> 3、識(shí)
8、別出的單詞以<種別碼,值>的二元式形式保存在符號(hào)表中并輸出;</p><p> 4、構(gòu)造出程序設(shè)計(jì)語(yǔ)言各語(yǔ)法單位的SLR分析表;(其他分析表亦可)</p><p> 5、能夠?qū)斎氲脑闯绦蜃龀稣_的語(yǔ)法分析并輸出清晰的結(jié)果;</p><p> 6、高級(jí)語(yǔ)言的規(guī)模不易過(guò)大,注重編譯器內(nèi)核的設(shè)計(jì),對(duì)于界面無(wú)要求;</p><p>
9、; 7、課程設(shè)計(jì)報(bào)告中應(yīng)對(duì)所自定義高級(jí)語(yǔ)言進(jìn)行簡(jiǎn)單描述,對(duì)編譯器的設(shè)計(jì)進(jìn)行簡(jiǎn)單的需求分析,給出設(shè)計(jì)說(shuō)明和程序結(jié)構(gòu)框架,闡明設(shè)計(jì)思路、用到的原理和方法。</p><p> 8、不可更改課程設(shè)計(jì)報(bào)告中已有的字體和格式,課程設(shè)計(jì)報(bào)告中新加入內(nèi)容,漢字采用宋體五號(hào)字,英文字符和數(shù)字采用Times New Roman五號(hào)字。</p><p> 9、課程設(shè)計(jì)報(bào)告中的運(yùn)行結(jié)果應(yīng)以程序運(yùn)行截圖形式出
10、現(xiàn)。</p><p> 10、程序源代碼以郵件名稱(chēng):“班級(jí)學(xué)號(hào)姓名”發(fā)送至指定郵箱:sqckcsj08@126.com</p><p><b> 四.進(jìn)度安排</b></p><p><b> 五.成績(jī)?cè)u(píng)定</b></p><p> 1.考核方法:通過(guò)現(xiàn)場(chǎng)考勤、檢查源程序和批改課程設(shè)計(jì)報(bào)告相
11、結(jié)合的方式考察學(xué)生的動(dòng)手能力,獨(dú)立分析解決問(wèn)題的能力和創(chuàng)新精神,并根據(jù)學(xué)生的學(xué)習(xí)態(tài)度綜合考評(píng)。</p><p> 2.成績(jī)?cè)u(píng)定:成績(jī)分優(yōu)、良、中、及格和不及格五等。</p><p><b> 六.設(shè)計(jì)思路</b></p><p><b> 1.詞法分析</b></p><p> ?。?)單詞符
12、號(hào)及種別表</p><p> 2.SLR的分析表:</p><p> 1). 算術(shù)表達(dá)式的SLR(1)分析表:</p><p> 算數(shù)表達(dá)式文法G[E]如下:</p><p> E->E+E|E*E|(E)|i</p><p> 將文法G[E]拓廣為文法G’[E]:(0) S’→E</p>
13、<p><b> E→E+E</b></p><p><b> E→E*E</b></p><p><b> E→(E)</b></p><p><b> E→i</b></p><p> 由此得到算數(shù)表達(dá)式的SLR(1)分析表如下:
14、</p><p> 2). 布爾表達(dá)式的SLR分析表:</p><p> 布爾表達(dá)式的文法如下:</p><p> B->B∧B|B∨B|¬B|I rop i|i</p><p> 為了便于語(yǔ)法分析時(shí)加工處理,我們將上述文法改為文法G[S]:</p><p> B→BAB|B0B|¬
15、B|(B)|I rop i|i</p><p><b> BA→B∧</b></p><p><b> B0 →B∨</b></p><p> 將文法G[S]拓廣為文法G[S’]:(0)S’→B</p><p><b> B →i</b></p><
16、;p> B →I rop i</p><p><b> B →(B)</b></p><p><b> B →NOT B</b></p><p><b> A →B AND</b></p><p><b> B →AB</b>&l
17、t;/p><p><b> O →B OR</b></p><p><b> B →OB</b></p><p> 由此得到布爾表達(dá)式的SLR(1)分析表如下:</p><p> 3). 程序語(yǔ)句的SLR分析表:</p><p> 程序語(yǔ)句的文法G[S]如下<
18、/p><p> S→if e then S else S|while e do S|begin L end|a</p><p><b> L→S;L|S</b></p><p> 由于在編譯程序設(shè)計(jì)與視線(xiàn)中,我們是將賦值語(yǔ)句與算數(shù)表達(dá)式歸為一類(lèi)處理的,故在此將賦值語(yǔ)句僅看作是程序語(yǔ)句文法中一個(gè)終結(jié)符a,將布爾表達(dá)式B也看作為終結(jié)符e。<
19、/p><p> 將文法G[S]拓廣為文法G[S’]:</p><p><b> (0)S’ →S</b></p><p> S →if e then S else S</p><p> S →while e do S</p><p> S →begin L end</p>
20、<p><b> S →a</b></p><p><b> L →S</b></p><p><b> L →S;L</b></p><p> 由此得到程序語(yǔ)句的SLR(1)分析表如下:</p><p> 七.源程序及運(yùn)行結(jié)果</p>
21、<p><b> 1)源代碼:</b></p><p> #include<stdio.h></p><p> #include<string.h></p><p> #include<stdlib.h></p><p> #define ACC -2</p
22、><p> /***************************************************************/</p><p> #define sy_if0</p><p> #define sy_then1</p><p> #define sy_else2</p><
23、p> #define sy_while3</p><p> #define sy_begin4</p><p> #define sy_do5</p><p> #define sy_end6</p><p> #define a7</p><p> #define semi
24、colon8</p><p> #define e9</p><p> #define jinghao10</p><p> #define S11</p><p> #define L12</p><p> #define tempsy15</p><
25、p> #define EA18</p><p> #define EO19</p><p> #define plus34</p><p> #define times36</p><p> #define becomes38</p><p> #define op_and
26、39</p><p> #define op_or40</p><p> #define op_not41</p><p> #define rop42</p><p> #define lparent48</p><p> #define rparent49</p>
27、<p> #define ident56</p><p> #define intconst57</p><p> /***************************************************************/</p><p> charch='\0';</p>&
28、lt;p> intcount=0;</p><p> static char spelling[10]={" "};</p><p> static char line[81]={" "};</p><p> char*pline;</p><p> staticch
29、ar ntab1[100][10];</p><p> structntab{</p><p><b> int tc;</b></p><p><b> int fc;</b></p><p> }ntab2[200];</p><p> intlabel=0
30、;</p><p> struct rwords{</p><p> char sp[10];</p><p><b> intsy;</b></p><p><b> };</b></p><p> struct rwords reswords[10]={&l
31、t;/p><p> {"if",sy_if},</p><p> {"do",sy_do},</p><p> {"else",sy_else},</p><p> {"while",sy_while},</p><p> {&quo
32、t;then",sy_then},</p><p> {"begin",sy_begin},</p><p> {"end",sy_end},</p><p> {"and",op_and},</p><p> {"or",op_or},<
33、/p><p> {"not",op_not}</p><p><b> };</b></p><p> struct aa{</p><p><b> int sy1;</b></p><p><b> int pos;</b>
34、</p><p> }buf[1000],</p><p><b> n,</b></p><p><b> n1,</b></p><p><b> E,</b></p><p> sstack[100],</p><p&
35、gt; ibuf[100],</p><p> stack[1000];</p><p> struct aa oth;</p><p> struct fourexp{</p><p> charop[10];</p><p> structaa arg1;</p><p>
36、 structaa arg2;</p><p> intresult;</p><p> }fexp[200];</p><p> intssp=0;</p><p> structaa *pbuf=buf;</p><p> intnlength=0;</p><p>
37、; intlnum=0;</p><p> inttt1=0;</p><p> FILE*cfile;</p><p> /***************************************************************/</p><p> intnewt=0;</p>&
38、lt;p> intnxq=100;</p><p><b> intlr;</b></p><p><b> intlr1;</b></p><p> intsp=0;</p><p> intstack1[100];</p><p>
39、intsp1=0;</p><p> intnum=0;</p><p> structll{</p><p><b> int nxq1;</b></p><p><b> int tc1;</b></p><p><b> int fc1;&
40、lt;/b></p><p> }labelmark[10];</p><p> int labeltemp[10];</p><p> int pointmark=-1,</p><p> pointtemp=-1;</p><p> int sign=0;</p><p>
41、 /********************* 程序語(yǔ)句的LR分析表 **********************/</p><p> static int action[19][13]={</p><p> /* 0*/{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,1,-1},</p><p> /* 1*/{-1,-1,-1,-1,-1,-1
42、,-1,-1,-1,-1,ACC,-1,-1},</p><p> /* 2*/{-1,-1,-1,-1,-1,-1,-1,-1,-1,6,-1,-1,-1},</p><p> /* 3*/{-1,-1,-1,-1,-1,-1,-1,-1,-1,7,-1,-1,-1,},</p><p> /* 4*/{2,-1,-1,3,5,-1,-1,5,-1,-1,-
43、1,9,8},</p><p> /* 5*/{-1,-1,104,-1,-1,-1,104,-1,104,-1,104,-1,-1},</p><p> /* 6*/{-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},</p><p> /* 7*/{-1,-1,-1,-1,-1,11,-1,-1,-1,-1,-1,-1,-1}
44、,</p><p> /* 8*/{-1,-1,-1,-1,-1,-1,12,-1,-1,-1,-1,-1,-1},</p><p> /* 9*/{-1,-1,-1,-1,-1,-1,105,-1,13,-1,-1,-1,-1},</p><p> /*10*/{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,14,-1},</p>
45、<p> /*11*/{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,14,-1},</p><p> /*12*/{-1,-1,103,-1,-1,-1,103,-1,103,-1,103,-1,-1},</p><p> /*13*/{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,9,16},</p><p> /*14
46、*/{-1,-1,17,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},</p><p> /*15*/{-1,-1,102,-1,-1,-1,102,-1,102,-1,102,-1,-1},</p><p> /*16*/{-1,-1,-1,-1,-1,-1,106,-1,-1,-1,-1,-1,-1},</p><p> /*17*/{2,
47、-1,-1,3,4,-1,-1,5,-1,-1,-1,18,-1},</p><p> /*18*/{-1,-1,101,-1,-1,-1,101,-1,101,-1,101,-1,-1}</p><p><b> };</b></p><p> /***************** 算術(shù)表達(dá)式的LR分析表 ***************
48、********/</p><p> static int action1[10][7]={</p><p> /* 0*/{3,-1,-1,2,-1,-1,1},</p><p> /* 1*/{-1,4,5,-1,-1,ACC,-1},</p><p> /* 2*/{3,-1,-1,2,-1,-1,6},</p>
49、<p> /* 3*/{-1,104,104,-1,104,104,-1},</p><p> /* 4*/{3,-1,-1,2,-1,-1,7},</p><p> /* 5*/{3,-1,-1,2,-1,-1,8},</p><p> /* 6*/{-1,4,5,-1,9,-1,-1},</p><p> /* 7*/
50、{-1,101,5,-1,101,101,-1},</p><p> /* 8*/{-1,102,102,-1,102,102,-1},</p><p> /* 9*/{-1,103,103,-1,103,103,-1}</p><p><b> };</b></p><p> /***************
51、布爾表達(dá)式LR分析表 **************************/</p><p> static int action2[16][11]={</p><p> /* 0*/{1,-1,4,-1,5,-1,-1,-1,13,7,8},</p><p> /* 1*/{-1,2,-1,101,101,101,-1,-1,-1,},</p>
52、<p> /* 2*/{3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},</p><p> /* 3*/{-1,-1,-1,102,-1,102,102,102,-1,-1,-1},</p><p> /* 4*/{1,-1,4,-1,5,-1,-1,-1,11,7,8},</p><p> /* 5*/{1,-1,4,-1,
53、5,-1,-1,-1,6,7,8},</p><p> /* 6*/{-1,-1,-1,104,-1,9,10,104,-1,-1,-1},</p><p> /* 7*/{1,-1,4,-1,5,-1,-1,-1,14,7,8},</p><p> /* 8*/{1,-1,4,-1,5,-1,-1,-1,15,7,8},</p><p&g
54、t; /* 9*/{105,-1,105,-1,105,-1,-1,-1,-1,-1,-1},</p><p> /*10*/{107,-1,107,-1,107,-1,-1,-1,-1,-1,-1},</p><p> /*11*/{-1,-1,-1,12,-1,9,10,-1,-1,-1,-1},</p><p> /*12*/{-1,-1,-1,103
55、,-1,103,103,103,-1,-1,-1},</p><p> /*13*/{-1,-1,-1,-1,-1,9,10,ACC,-1,-1,-1},</p><p> /*14*/{-1,-1,-1,106,-1,9,10,106,-1,-1,-1},</p><p> /*15*/{-1,-1,-1,108,-1,9,10,108,-1,-1,-1}&
56、lt;/p><p><b> };</b></p><p> /************* 從文件讀取一行到緩沖區(qū) *************************/</p><p> void readline()</p><p><b> {</b></p><p>
57、;<b> char ch1;</b></p><p> pline=line;</p><p> ch1=getc(cfile);</p><p> while(ch1!='\n'){</p><p> *pline=ch1;</p><p><b> pl
58、ine++;</b></p><p> ch1=getc(cfile);</p><p><b> }</b></p><p> *pline='\0';</p><p> pline=line;</p><p><b> }</b>&l
59、t;/p><p> /***************** 從緩沖區(qū)讀取一個(gè)字符 ***********************/</p><p> void readch()</p><p><b> {</b></p><p> if(ch=='\0'){</p><p>
60、 readline();</p><p><b> lnum++;</b></p><p><b> }</b></p><p> ch=*pline;</p><p><b> pline++;</b></p><p><b> }
61、</b></p><p> /**************** 標(biāo)識(shí)符和關(guān)鍵字的識(shí)別 *************************/</p><p> int find(char spel[])</p><p><b> {</b></p><p> int ss1=0;</p>
62、<p><b> int ii=0;</b></p><p> while((ss1==0)&&(ii<nlength)){</p><p> if(!strcmp(spel,ntab1[ii])) ss1=1;</p><p><b> ii++;</b></p>&
63、lt;p><b> }</b></p><p> if(ss1==1) return ii-1;</p><p> else return -1;</p><p><b> }</b></p><p> void identifier()</p><p>&l
64、t;b> {</b></p><p> int iii=0,j,k;</p><p><b> int ss=0;</b></p><p><b> k=0;</b></p><p><b> do{</b></p><p>
65、 spelling[k]=ch;</p><p><b> k++;</b></p><p><b> readch();</b></p><p> }while(((ch>='a')&&(ch<='z'))||((ch>='0')&
66、amp;&(ch<='9')));</p><p><b> pline--;</b></p><p> spelling[k]='\0';</p><p> while((ss==0)&&(iii<10)){</p><p> if(!strc
67、mp(spelling,reswords[iii].sp)) ss=1;</p><p><b> iii++;</b></p><p><b> }</b></p><p><b> /*關(guān)鍵字匹配*/</b></p><p> if(ss==1){</p>
68、;<p> buf[count].sy1=reswords[iii-1].sy;</p><p><b> }</b></p><p><b> else{</b></p><p> buf[count].sy1=ident;</p><p> j=find(spelling
69、);</p><p> if(j==-1){</p><p> buf[count].pos=tt1;</p><p> strcpy(ntab1[tt1],spelling);</p><p><b> tt1++;</b></p><p> nlength++;</p>
70、<p><b> }</b></p><p> else buf[count].pos=j;</p><p><b> }</b></p><p><b> count++;</b></p><p><b> }</b></p&
71、gt;<p> /******************** 數(shù)字識(shí)別 *********************************/</p><p> void number()</p><p><b> {</b></p><p> int ivalue=0;</p><p> int d
72、igit;</p><p><b> do{</b></p><p> digit=ch-'0';</p><p> ivalue=ivalue*10+digit;</p><p><b> readch();</b></p><p> }while
73、((ch>='0')&&(ch<='9'));</p><p> buf[count].sy1=intconst;</p><p> buf[count].pos=ivalue;</p><p><b> count++;</b></p><p><
74、b> pline--;</b></p><p><b> }</b></p><p> /****************** 掃描主函數(shù) ********************************/</p><p> void scan()</p><p><b> {&l
75、t;/b></p><p><b> //int i;</b></p><p> while(ch!='~'){</p><p> switch(ch){</p><p><b> case ' ':</b></p><p>&
76、lt;b> break;</b></p><p><b> case 'a':</b></p><p><b> case 'b':</b></p><p><b> case 'c':</b></p><p
77、><b> case 'd':</b></p><p><b> case 'e':</b></p><p><b> case 'f':</b></p><p><b> case 'g':</b>&
78、lt;/p><p><b> case 'h':</b></p><p><b> case 'i':</b></p><p><b> case 'j':</b></p><p><b> case 'k&
79、#39;:</b></p><p><b> case 'l':</b></p><p><b> case 'm':</b></p><p><b> case 'n':</b></p><p><b&g
80、t; case 'o':</b></p><p><b> case 'p':</b></p><p><b> case 'q':</b></p><p><b> case 'r':</b></p>
81、<p><b> case 's':</b></p><p><b> case 't':</b></p><p><b> case 'u':</b></p><p><b> case 'v':</b
82、></p><p><b> case 'w':</b></p><p><b> case 'x':</b></p><p><b> case 'y':</b></p><p><b> case
83、39;z':</b></p><p> identifier();</p><p><b> break;</b></p><p><b> case '0':</b></p><p><b> case '1':</b&g
84、t;</p><p><b> case '2':</b></p><p><b> case '3':</b></p><p><b> case '4':</b></p><p><b> case '
85、;5':</b></p><p><b> case '6':</b></p><p><b> case '7':</b></p><p><b> case '8':</b></p><p><
86、b> case '9':</b></p><p><b> number();</b></p><p><b> break;</b></p><p><b> case '<':</b></p><p><
87、b> readch();</b></p><p> if(ch=='='){</p><p> buf[count].pos=0;</p><p><b> }</b></p><p><b> else{</b></p><p>
88、 if(ch=='>') buf[count].pos=4;</p><p><b> else{</b></p><p> buf[count].pos=1;</p><p><b> pline--;</b></p><p><b> }</b&g
89、t;</p><p><b> }</b></p><p> buf[count].sy1=rop;</p><p><b> count++;</b></p><p><b> break;</b></p><p><b> cas
90、e '>':</b></p><p><b> readch();</b></p><p> if(ch=='='){</p><p> buf[count].pos=2;</p><p><b> }</b></p><
91、p><b> else{</b></p><p> buf[count].pos=3;</p><p><b> pline--;</b></p><p><b> }</b></p><p> buf[count].sy1=rop;</p>&l
92、t;p><b> count++;</b></p><p><b> break;</b></p><p><b> case '(':</b></p><p> buf[count].sy1=lparent;</p><p><b>
93、 count++;</b></p><p><b> break;</b></p><p><b> case ')':</b></p><p> buf[count].sy1=rparent;</p><p><b> count++;</b&g
94、t;</p><p><b> break;</b></p><p><b> case '#':</b></p><p> buf[count].sy1=jinghao;</p><p><b> count++;</b></p><
95、;p><b> break;</b></p><p><b> case '+':</b></p><p> buf[count].sy1=plus;</p><p><b> count++;</b></p><p><b> bre
96、ak;</b></p><p><b> case '*':</b></p><p> buf[count].sy1=times;</p><p><b> count++;</b></p><p><b> break;</b></p
97、><p><b> case ':':</b></p><p><b> readch();</b></p><p> if(ch=='=')</p><p> buf[count].sy1=becomes;</p><p><b&g
98、t; count++;</b></p><p><b> break;</b></p><p><b> case '=':</b></p><p> buf[count].sy1=rop;</p><p> buf[count].pos=5;</p>
99、;<p><b> count++;</b></p><p><b> break;</b></p><p><b> case ';':</b></p><p> buf[count].sy1=semicolon;</p><p><
100、;b> count++;</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> readch();</b></p><p><b> }</b></p>
101、;<p> buf[count].sy1=-1;</p><p><b> }</b></p><p> /***************************************************************/</p><p> void readnu()</p><p>
102、<b> {</b></p><p> if(pbuf->sy1>=0){</p><p> n.sy1=pbuf->sy1;</p><p> n.pos=pbuf->pos;</p><p><b> pbuf++;</b></p><p&g
103、t;<b> }</b></p><p><b> }</b></p><p> /******************* 中間變量生成 ******************************/</p><p> int newtemp()</p><p><b> {&l
104、t;/b></p><p><b> newt++;</b></p><p> return newt;</p><p><b> }</b></p><p> /********************** 生成四元式 *****************************/&l
105、t;/p><p> int gen(char op1[],struct aa arg11,struct aa arg22,int result1)</p><p><b> {</b></p><p> strcpy(fexp[nxq].op,op1);</p><p> fexp[nxq].arg1.sy1=arg
106、11.sy1;</p><p> fexp[nxq].arg1.pos=arg11.pos;</p><p> fexp[nxq].arg2.sy1=arg22.sy1;</p><p> fexp[nxq].arg2.pos=arg22.pos;</p><p> fexp[nxq].result=result1;</p>
107、;<p><b> nxq++;</b></p><p> return nxq-1;</p><p><b> }</b></p><p> /********************** 布爾表達(dá)式的匹配 ***********************/</p><p>
108、 int merg(int p1,int p2)//拉鏈函數(shù)</p><p><b> {</b></p><p><b> int p;</b></p><p> if(p2==0) return p1;</p><p><b> else{</b>&l
109、t;/p><p><b> p=p2;</b></p><p> while(fexp[p].result!=0)p=fexp[p].result;</p><p> fexp[p].result=p1;</p><p> return p2;</p><p><b> }<
110、/b></p><p><b> }</b></p><p> void backpatch(int p,int t)//返填函數(shù)</p><p><b> {</b></p><p> int tempq;</p><p><b> i
111、nt q;</b></p><p><b> q=p;</b></p><p> while(q!=0){</p><p> tempq=fexp[q].result;</p><p> fexp[q].result=t;</p><p><b> q=tempq;
112、</b></p><p><b> }</b></p><p><b> }</b></p><p> /***************************************************************/</p><p> int change1(i
113、nt chan)</p><p><b> {</b></p><p> switch(chan){</p><p> case ident:</p><p> case intconst:</p><p><b> return 0;</b></p>
114、<p> case plus:</p><p><b> return 1;</b></p><p> case times:</p><p><b> return 2;</b></p><p> case lparent:</p><p><b
115、> return 3;</b></p><p> case rparent:</p><p><b> return 4;</b></p><p> case jinghao:</p><p><b> return 5;</b></p><p>
116、 case tempsy:</p><p><b> return 6;</b></p><p><b> }</b></p><p><b> }</b></p><p> int change2(int chan)</p><p><
117、b> {</b></p><p> switch(chan){</p><p> case ident:</p><p> case intconst:</p><p><b> return 0;</b></p><p><b> case rop:<
118、;/b></p><p><b> return 1;</b></p><p> case lparent:</p><p><b> return 2;</b></p><p> case rparent:</p><p><b> return
119、3;</b></p><p> case op_not:</p><p><b> return 4;</b></p><p> case op_and:</p><p><b> return 5;</b></p><p> case op_or:&l
120、t;/p><p><b> return 6;</b></p><p> case jinghao:</p><p><b> return 7;</b></p><p> case tempsy:</p><p><b> return 8;</b&g
121、t;</p><p><b> case EA:</b></p><p><b> return 9;</b></p><p><b> case EO:</b></p><p> return 10;</p><p><b> }&
122、lt;/b></p><p><b> }</b></p><p> /******************* 賦值語(yǔ)句的分析 **************************/</p><p> void lrparse1(int num)</p><p><b> {</b>&
123、lt;/p><p> lr1=action1[stack1[sp1]][change1(n1.sy1)];</p><p> if(lr1==-1){</p><p> printf("\n算數(shù)表達(dá)式或賦值語(yǔ)句出錯(cuò)!\n");</p><p> getchar();</p><p><b&
124、gt; exit(0);</b></p><p><b> }</b></p><p> if((lr1<10)&&(lr1>=0)){ //移進(jìn)</p><p><b> sp1++;</b></p><p> stack1
125、[sp1]=lr1;</p><p> if(n1.sy1!=tempsy){</p><p><b> ssp++;</b></p><p><b> num++;</b></p><p> sstack[ssp].sy1=n1.sy1;</p><p> sst
126、ack[ssp].pos=n1.pos;</p><p><b> }</b></p><p> n1.sy1=ibuf[num].sy1; </p><p><b> }</b></p><p> if((lr1>=100)&&(lr1<105)){
127、 //歸約</p><p> switch(lr1){</p><p><b> case 100:</b></p><p><b> break;</b></p><p><b> case 101:</b></p><p> E.p
128、os=newtemp();</p><p> gen("+",sstack[ssp-2],sstack[ssp],E.pos+100);</p><p> ssp=ssp-2;</p><p> sstack[ssp].sy1=tempsy;</p><p> sstack[ssp].pos=E.pos;</
129、p><p> sp1=sp1-3;</p><p><b> break;</b></p><p><b> case 103:</b></p><p> E.pos=sstack[ssp-1].pos;</p><p> ssp=ssp-2;</p>&
130、lt;p> sstack[ssp].sy1=tempsy;</p><p> sstack[ssp].pos=E.pos;</p><p> sp1=sp1-3;</p><p><b> break;</b></p><p><b> case 104:</b></p>
131、<p> E.pos=sstack[ssp].pos;</p><p><b> sp1--;</b></p><p><b> break;</b></p><p><b> }</b></p><p> n1.sy1=tempsy;</p>
132、;<p> n1.pos=E.pos;</p><p> lrparse1(num);</p><p><b> }</b></p><p> if((lr1==ACC)&&(stack1[sp1]==1)){ </p><p> gen(":="
133、;,sstack[ssp],oth,ibuf[0].pos);</p><p> ssp=ssp-3;</p><p> sp1=sp1-3;</p><p><b> }</b></p><p><b> }</b></p><p> /*************
134、***** 布爾表達(dá)式的分析 *************************/</p><p> int lrparse2(int num)</p><p><b> {</b></p><p> int templabel;</p><p> lr1=action2[stack1[sp1]][change2
135、(n1.sy1)];</p><p> if(lr1==-1){</p><p> if(sign==2) printf("\nwhile語(yǔ)句出錯(cuò)!\n");</p><p> if(sign==3) printf("\nif語(yǔ)句出錯(cuò)! \n");</p><p> getchar();<
136、/p><p><b> exit(0);</b></p><p><b> }</b></p><p> if((lr1<16)&&(lr1>=0)){</p><p><b> sp1++;</b></p><p>
137、stack1[sp1]=lr1;</p><p><b> ssp++;</b></p><p> sstack[ssp].sy1=n1.sy1;</p><p> sstack[ssp].pos=n1.pos;</p><p> if((n1.sy1!=tempsy)&&(n1.sy1!=EA)
138、&&(n1.sy1!=EO))</p><p><b> num++;</b></p><p> n1.sy1=ibuf[num].sy1;</p><p> n1.pos=ibuf[num].pos;</p><p> lrparse2(num);</p><p><
139、;b> }</b></p><p> if((lr1>=100)&&(lr1<109)){</p><p> switch(lr1){</p><p><b> case 100:</b></p><p><b> break;</b><
140、/p><p><b> case 101:</b></p><p> ntab2[label].tc=nxq;</p><p> ntab2[label].fc=nxq+1;</p><p> gen("jnz",sstack[ssp],oth,0);</p><p>
141、gen("j",oth,oth,0);</p><p><b> sp1--;</b></p><p><b> ssp--;</b></p><p><b> label++;</b></p><p> n1.sy1=tempsy;</p&g
142、t;<p><b> break;</b></p><p><b> case 102:</b></p><p> ntab2[label].tc=nxq;</p><p> ntab2[label].fc=nxq+1;</p><p> switch(sstack[ssp-
143、1].pos){</p><p><b> case 0:</b></p><p> gen("j<=",sstack[ssp-2],sstack[ssp],0);</p><p><b> break;</b></p><p><b> case 1:&
144、lt;/b></p><p> gen("j<",sstack[ssp-2],sstack[ssp],0);</p><p><b> break;</b></p><p><b> case 2:</b></p><p> gen("j>=&
145、quot;,sstack[ssp-2],sstack[ssp],0);</p><p><b> break;</b></p><p><b> case 3:</b></p><p> gen("j>",sstack[ssp-2],sstack[ssp],0);</p>&l
146、t;p><b> break;</b></p><p><b> case 4:</b></p><p> gen("j<>",sstack[ssp-2],sstack[ssp],0);</p><p><b> break;</b></p>
147、<p><b> case 5:</b></p><p> gen("j=",sstack[ssp-2],sstack[ssp],0);</p><p><b> break;</b></p><p><b> }</b></p><p>
148、; gen("j",oth,oth,0);</p><p> ssp=ssp-3;</p><p> sp1=sp1-3;</p><p><b> label++;;</b></p><p> n1.sy1=tempsy;</p><p><b> br
149、eak;</b></p><p><b> case 103:</b></p><p> label=label-1;</p><p> ssp=ssp-3;</p><p> sp1=sp1-3;</p><p><b> label++;</b>&l
150、t;/p><p> n1.sy1=tempsy;</p><p><b> break;</b></p><p><b> case 104:</b></p><p> label=label-1;</p><p> templabel=ntab2[label].tc;
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 編譯原理課程設(shè)計(jì)--c語(yǔ)言編譯器實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)--c語(yǔ)言編譯器實(shí)現(xiàn)
- c語(yǔ)言編譯器實(shí)現(xiàn)-編譯原理課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)____c語(yǔ)言編譯器的實(shí)現(xiàn)-
- 編譯原理課程設(shè)計(jì)---c語(yǔ)言編譯器的實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)---s語(yǔ)言的編譯器的設(shè)計(jì)與實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)---編譯器的實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)--編譯器
- 編譯原理課程設(shè)計(jì)報(bào)告--編譯器實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)---簡(jiǎn)單編譯器的設(shè)計(jì)與實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)報(bào)告_編譯器
- 編譯原理課程的設(shè)計(jì)--c語(yǔ)言編譯器
- 編譯原理課程設(shè)計(jì)報(bào)告---編譯器功能的實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)___c語(yǔ)言編譯器的實(shí)現(xiàn)畢業(yè)論文
- 編譯原理課程設(shè)計(jì)報(bào)告-簡(jiǎn)單文法的編譯器的設(shè)計(jì)與實(shí)現(xiàn)
- c語(yǔ)言編譯器前端的設(shè)計(jì)與實(shí)現(xiàn)課程設(shè)計(jì)
- 小型c語(yǔ)言編譯器設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)--一個(gè)簡(jiǎn)單文法的編譯器的設(shè)計(jì)與實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)---一個(gè)簡(jiǎn)單編譯器的設(shè)計(jì)與分析
- 編譯原理課程設(shè)計(jì)--一個(gè)簡(jiǎn)單文法的編譯器前端的設(shè)計(jì)與實(shí)現(xiàn)
評(píng)論
0/150
提交評(píng)論