版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 福建農(nóng)林大學(xué)計算機與信息學(xué)院</p><p><b> 計算機類</b></p><p><b> 課程設(shè)計報告</b></p><p> 2011~2012學(xué)年第一學(xué)期</p><p> 課程名稱:編譯原理</p><p> 課程設(shè)計題目:語法分
2、析器</p><p> 姓 名:</p><p> 系:計算機</p><p> 專 業(yè):</p><p> 年 級:</p><p> 學(xué) 號:</p><p> 指導(dǎo)教師:</p><p> 福建農(nóng)林大學(xué)計算機與信息學(xué)院計算機類</p&
3、gt;<p><b> 課程設(shè)計結(jié)果評定</b></p><p> 目 錄</p><p> 1 正則表達(dá)式1</p><p> 1.1 正則表達(dá)式1</p><p> 1.2 確定化(化簡)后的狀態(tài)轉(zhuǎn)換圖1</p><p> 1.3 分析程序
4、代碼1</p><p> 1.4 程序運行截圖1</p><p><b> 1.5 小結(jié)1</b></p><p> 2 LL(1)分析2</p><p> 2.1 LL(1)文法2</p><p> 2.2 LL(1)預(yù)測分析表2</p><p&
5、gt; 2.3 分析程序代碼2</p><p> 2.4 程序運行截圖2</p><p><b> 2.5 小結(jié)2</b></p><p> 3 算符優(yōu)先分析3</p><p> 3.1 算符優(yōu)先文法3</p><p> 3.2 算符優(yōu)先關(guān)系表3</p&g
6、t;<p> 3.3 分析程序代碼3</p><p> 3.4 程序運行截圖3</p><p><b> 3.5 小結(jié)3</b></p><p><b> 4 LR分析4</b></p><p> 4.1 LR文法4</p><p>
7、; 4.2 LR分析表4</p><p> 4.3 分析程序代碼4</p><p> 4.4 程序運行截圖4</p><p><b> 4.5 小結(jié)4</b></p><p><b> 參考文獻(xiàn):4</b></p><p><b> 1
8、 正則表達(dá)式</b></p><p> 1.1 正則表達(dá)式</p><p> (a|b)*(aa|bb)(a|b)* (注:該正規(guī)式為示例,可更改)</p><p> 1.2 確定化(化簡)后的狀態(tài)轉(zhuǎn)換圖</p><p> 1.3 分析程序代碼</p><p> 程序要求:用戶輸入一個符
9、號串,程序判斷是否為給定方法的句子。</p><p> 五號字,固定值12磅行間距。</p><p><b> 程序要有注釋</b></p><p> #include <stdio.h></p><p> #include <string.h></p><p>
10、 #include <stdio.h></p><p> #include <iostream></p><p> #define STRM 5</p><p> #define STRN 2</p><p> class CodeParse</p><p><b> {&l
11、t;/b></p><p><b> public:</b></p><p> void CodeParse::disPlayResult(int argc,char * argv[]);</p><p><b> private:</b></p><p> int analyzer(
12、char *words);</p><p><b> };</b></p><p> int CodeParse::analyzer(char *words)</p><p><b> {</b></p><p> int index=0,tab_pint=1;</p><
13、;p> int map_table[STRM][STRN] = {{1,2},{2,3},{4,3},{2,4},{4,4}};</p><p> while(words[index]!='\0')</p><p><b> {</b></p><p> if(words[index]=='a')&
14、lt;/p><p><b> {</b></p><p> tab_pint=map_table[tab_pint][0];</p><p><b> }</b></p><p> else if(words[index]=='b')</p><p>&l
15、t;b> {</b></p><p> tab_pint=map_table[tab_pint][1];</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p>&
16、lt;p> printf("Error of the input\n");</p><p><b> return 0;</b></p><p><b> } </b></p><p><b> index++;</b></p><p><
17、;b> }</b></p><p> if (tab_pint==4) </p><p><b> return 1;</b></p><p><b> else</b></p><p><b> return 0;</b></p>&
18、lt;p><b> }</b></p><p> void CodeParse::disPlayResult(int argc,char * argv[])</p><p><b> {</b></p><p> if (analyzer(argv[1])>0)</p><p>
19、 std::cout<<"The str is right"<<std::endl;</p><p><b> else</b></p><p> std::cout<<"input ERROR"<<std::endl;</p><p><b&g
20、t; }</b></p><p> int main(int argc,char * argv[])</p><p><b> {</b></p><p> if(argc!=2)</p><p> std::cout<<"The commond is error"&
21、lt;<std::endl;</p><p><b> else</b></p><p><b> {</b></p><p> CodeParse codeParse;</p><p> codeParse.disPlayResult(argc,argv);</p>&
22、lt;p><b> }</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> 1.4 程序運行截圖</p><p><b> 1.5 小結(jié):</b></p>&
23、lt;p> 2 LL(1)分析</p><p> 2.1 LL(1)文法</p><p> E→TE' (注:該文法為示例,可更改)</p><p><b> E'→+TE'|ε</b></p><p><b> T→FT'</b><
24、/p><p><b> T'→*FT'|ε</b></p><p><b> F→(E)|i</b></p><p> 2.2 LL(1)預(yù)測分析表</p><p> 2.3 分析程序代碼</p><p> 程序要求:用戶輸入一個符號串,程序判斷是否
25、為給定方法的句子。</p><p> 五號字,固定值12磅行間距。</p><p><b> 程序要有注釋</b></p><p> #include"stdio.h"</p><p> #include"string.h"</p><p> #d
26、efine maxsize 20</p><p> #include"stdio.h"</p><p> #include "string.h" </p><p> //定義產(chǎn)生式結(jié)構(gòu)體</p><p> struct production</p><p><b&g
27、t; {</b></p><p> char token;</p><p> int tokens[6];</p><p><b> };</b></p><p><b> //定義堆棧結(jié)構(gòu)</b></p><p> struct stack</
28、p><p><b> {</b></p><p> char stackwords[maxsize];</p><p> int stack_top;</p><p><b> };</b></p><p> class LLOneParse</p>&l
29、t;p><b> {</b></p><p><b> public:</b></p><p> void initial();</p><p> int analyzer(char *words);</p><p><b> private:</b></
30、p><p> void push_stack(int num);</p><p> int seekkeyword(char word);</p><p> int seektoken(char word);</p><p><b> private:</b></p><p> struct
31、 production variable[5];</p><p> struct stack astack;</p><p> char produce[7][6];</p><p><b> };</b></p><p> void LLOneParse::initial()</p><
32、p><b> {</b></p><p><b> //初始化堆棧</b></p><p> astack.stack_top=1;</p><p> astack.stackwords[0]='#';</p><p> astack.stackwords[1]=
33、39;E';</p><p><b> //初始化產(chǎn)生式</b></p><p> strcpy(produce[1],"DT");</p><p> strcpy(produce[2],"DT+");</p><p> strcpy(produce[3],&quo
34、t;HF");</p><p> strcpy(produce[4],"HF*");</p><p> strcpy(produce[5],")E(");</p><p> strcpy(produce[6],"i");</p><p><b> //初始
35、化二維表</b></p><p> variable[0].token='E';</p><p> variable[0].tokens[0]=1;</p><p> variable[0].tokens[1]=-1;</p><p> variable[0].tokens[2]=-1;</p>
36、<p> variable[0].tokens[3]=1;</p><p> variable[0].tokens[4]=-1;</p><p> variable[0].tokens[5]=-1;</p><p> variable[1].token='D';</p><p> variable[1]
37、.tokens[0]=-1;</p><p> variable[1].tokens[1]=2;</p><p> variable[1].tokens[2]=-1;</p><p> variable[1].tokens[3]=-1;</p><p> variable[1].tokens[4]=0;</p><
38、p> variable[1].tokens[5]=0;</p><p> variable[2].token='T';</p><p> variable[2].tokens[0]=3;</p><p> variable[2].tokens[1]=-1;</p><p> variable[2].tokens
39、[2]=-1;</p><p> variable[2].tokens[3]=3;</p><p> variable[2].tokens[4]=-1;</p><p> variable[2].tokens[5]=-1;</p><p> variable[3].token='H';</p><p
40、> variable[3].tokens[0]=-1;</p><p> variable[3].tokens[1]=0;</p><p> variable[3].tokens[2]=4;</p><p> variable[3].tokens[3]=-1;</p><p> variable[3].tokens[4]=0;
41、</p><p> variable[3].tokens[5]=0;</p><p> variable[4].token='F';</p><p> variable[4].tokens[0]=6;</p><p> variable[4].tokens[1]=-1;</p><p> va
42、riable[4].tokens[2]=-1;</p><p> variable[4].tokens[3]=5;</p><p> variable[4].tokens[4]=-1;</p><p> variable[4].tokens[5]=-1;</p><p><b> }</b></p>
43、<p><b> //產(chǎn)生式進(jìn)棧</b></p><p> void LLOneParse::push_stack(int num)</p><p><b> {</b></p><p><b> int i=0;</b></p><p> if (num
44、!=0)</p><p><b> {</b></p><p> while(produce[num][i]!='\0')</p><p><b> {</b></p><p> astack.stack_top++;</p><p> astack
45、.stackwords[astack.stack_top]=produce[num][i];</p><p><b> i++;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b&
46、gt;</p><p> int LLOneParse::seekkeyword(char word)</p><p><b> {</b></p><p><b> int i=0;</b></p><p> for(i=0;i<5;i++)</p><p>
47、 if (word==variable[i].token)</p><p><b> return i;</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> int LLOneParse::seekto
48、ken(char word)</p><p><b> {</b></p><p> switch(word)</p><p><b> {</b></p><p> case 'i': return 0;</p><p> case '+&
49、#39;:return 1;</p><p> case '*': return 2;</p><p> case '(': return 3;</p><p> case ')': return 4;</p><p> case '#':return 5;</p&
50、gt;<p> default:return -1;</p><p><b> }</b></p><p><b> }</b></p><p> int LLOneParse::analyzer(char *words)</p><p><b> {</b&
51、gt;</p><p> int index=0;//字符指針</p><p><b> int i=0;</b></p><p> int marki=-1;//標(biāo)記找到的字符</p><p> int markj=-1;</p><p> while(astack.stackwor
52、ds[astack.stack_top]!='#')</p><p><b> {</b></p><p> //堆棧指向終結(jié)符的情況</p><p> if ( seektoken(astack.stackwords[astack.stack_top])!=-1)</p><p><b>
53、; {</b></p><p> if(seektoken(words[index])==seektoken(astack.stackwords[astack.stack_top]))</p><p><b> {</b></p><p> astack.stack_top--;</p><p>&
54、lt;b> index++;</b></p><p><b> continue;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> return 0;</b>&
55、lt;/p><p><b> }</b></p><p> marki=seekkeyword(astack.stackwords[astack.stack_top]);//尋找匹配變量</p><p> markj=seektoken(words[index]);//尋找匹配字符</p><p> //判斷表達(dá)式是
56、否有對應(yīng)的產(chǎn)生式</p><p> if (markj!=-1)</p><p><b> {</b></p><p> if (variable[marki].tokens[markj]!=-1)</p><p><b> { </b></p><p> asta
57、ck.stack_top--;</p><p> push_stack(variable[marki].tokens[markj]);//壓入堆棧</p><p><b> }</b></p><p><b> else</b></p><p> return 0;</p>
58、<p><b> }</b></p><p><b> else</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> if(words[index]=='#
59、39;)</p><p><b> return 1;</b></p><p><b> else</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> in
60、t main(int argc, char* argv[])</p><p><b> {</b></p><p> LLOneParse llOneParse;</p><p> char userinput[maxsize];</p><p> llOneParse.initial();//調(diào)用初始化函數(shù)&l
61、t;/p><p> printf("請輸入字符串以#號結(jié)束:");</p><p> scanf("%s",userinput);</p><p> if (llOneParse.analyzer(userinput)>0)//調(diào)用程序</p><p> printf("字符輸入合法
62、\n");</p><p><b> else</b></p><p> printf("非法輸入\n");</p><p><b> return 0;</b></p><p><b> }</b></p><p>
63、; 2.4 程序運行截圖</p><p><b> 2.5 小結(jié)</b></p><p><b> 3 算符優(yōu)先分析</b></p><p> 3.1 算符優(yōu)先文法</p><p> E→T | E+T | E-T (注:該文法為示例,可更改)</p><p&
64、gt; T→F | T*F | T/F</p><p><b> F→(E) | i</b></p><p> 3.2 算符優(yōu)先關(guān)系表</p><p> 3.3 分析程序代碼</p><p> 程序要求:用戶輸入一個符號串,程序判斷是否為給定方法的句子。</p><p> 五號字,
65、固定值12磅行間距。</p><p><b> 程序要有注釋</b></p><p> #include"stdio.h"</p><p> #include"string.h"</p><p> #define maxsize 20</p><p>
66、; #include"stdio.h"</p><p> #include "string.h" </p><p><b> //定義堆棧結(jié)構(gòu)</b></p><p> struct stack</p><p><b> {</b></p>
67、;<p> char stackwords[maxsize];</p><p> int stack_top;</p><p><b> };</b></p><p><b> //定義二維關(guān)系表</b></p><p> struct tokens</p>&
68、lt;p><b> {</b></p><p> char token;</p><p> int relation[8];</p><p><b> };</b></p><p> class ProcessParse</p><p><b>
69、{</b></p><p><b> public:</b></p><p> void initial();</p><p> int analyzer(char *words);</p><p><b> private:</b></p><p>
70、int seektoken(char word);</p><p> void pop_stack();</p><p><b> private:</b></p><p> struct stack astack;</p><p> struct tokens atoken[8];</p><
71、;p><b> };</b></p><p><b> //初始化數(shù)據(jù)</b></p><p> void ProcessParse::initial()</p><p><b> {</b></p><p><b> //初始化堆棧</b>
72、;</p><p> astack.stack_top=0;</p><p> astack.stackwords[0]='#';</p><p><b> //初始化二維表</b></p><p> atoken[0].token='+';</p><p>
73、; atoken[0].relation[0]=2;</p><p> atoken[0].relation[1]=2;</p><p> atoken[0].relation[2]=1;</p><p> atoken[0].relation[3]=1;</p><p> atoken[0].relation[4]=1;</
74、p><p> atoken[0].relation[5]=2;</p><p> atoken[0].relation[6]=1;</p><p> atoken[0].relation[7]=2;</p><p> atoken[1].token='-';</p><p> atoken[1].
75、relation[0]=2;</p><p> atoken[1].relation[1]=2;</p><p> atoken[1].relation[2]=1;</p><p> atoken[1].relation[3]=1;</p><p> atoken[1].relation[4]=1;</p><p&
76、gt; atoken[1].relation[5]=2;</p><p> atoken[1].relation[6]=1;</p><p> atoken[1].relation[7]=2;</p><p> atoken[2].token='*';</p><p> atoken[2].relation[0]=2
77、;</p><p> atoken[2].relation[1]=2;</p><p> atoken[2].relation[2]=2;</p><p> atoken[2].relation[3]=2;</p><p> atoken[2].relation[4]=1;</p><p> atoken[2
78、].relation[5]=2;</p><p> atoken[2].relation[6]=1;</p><p> atoken[2].relation[7]=2;</p><p> atoken[3].token='/';</p><p> atoken[3].relation[0]=2;</p>
79、<p> atoken[3].relation[1]=2;</p><p> atoken[3].relation[2]=2;</p><p> atoken[3].relation[3]=2;</p><p> atoken[3].relation[4]=1;</p><p> atoken[3].relation[5]
80、=2;</p><p> atoken[3].relation[6]=1;</p><p> atoken[3].relation[7]=2;</p><p> atoken[4].token='(';</p><p> atoken[4].relation[0]=1;</p><p> at
81、oken[4].relation[1]=1;</p><p> atoken[4].relation[2]=1;</p><p> atoken[4].relation[3]=1;</p><p> atoken[4].relation[4]=1;</p><p> atoken[4].relation[5]=0;</p>
82、<p> atoken[4].relation[6]=1;</p><p> atoken[4].relation[7]=2;</p><p> atoken[5].token=')';</p><p> atoken[5].relation[0]=2;</p><p> atoken[5].relat
83、ion[1]=2;</p><p> atoken[5].relation[2]=2;</p><p> atoken[5].relation[3]=2;</p><p> atoken[5].relation[4]=-1;</p><p> atoken[5].relation[5]=2;</p><p>
84、 atoken[5].relation[6]=-1;</p><p> atoken[5].relation[7]=2;</p><p> atoken[6].token='i';</p><p> atoken[6].relation[0]=2;</p><p> atoken[6].relation[1]=2;&l
85、t;/p><p> atoken[6].relation[2]=2;</p><p> atoken[6].relation[3]=2;</p><p> atoken[6].relation[4]=-1;</p><p> atoken[6].relation[5]=2;</p><p> atoken[6].
86、relation[6]=-1;</p><p> atoken[6].relation[7]=2;</p><p> atoken[7].token='#';</p><p> atoken[7].relation[0]=1;</p><p> atoken[7].relation[1]=1;</p>&
87、lt;p> atoken[7].relation[2]=1;</p><p> atoken[7].relation[3]=1;</p><p> atoken[7].relation[4]=1;</p><p> atoken[7].relation[5]=1;</p><p> atoken[7].relation[6]=
88、1;</p><p> atoken[7].relation[7]=0;</p><p><b> }</b></p><p> int ProcessParse::seektoken(char word)</p><p><b> {</b></p><p> s
89、witch(word)</p><p><b> {</b></p><p> case '+':return 0;</p><p> case '-': return 1;</p><p> case '*': return 2;</p><p
90、> case '/': return 3;</p><p> case '(': return 4;</p><p> case ')': return 5;</p><p> case 'i': return 6;</p><p> case '#
91、9;:return 7;</p><p> default:return -1;</p><p><b> }</b></p><p><b> }</b></p><p> void ProcessParse::pop_stack()</p><p><b&g
92、t; {</b></p><p> while(astack.stackwords[astack.stack_top]!='<')</p><p><b> {</b></p><p> astack.stack_top--;</p><p><b> }</b
93、></p><p> astack.stack_top--;</p><p><b> }</b></p><p> int ProcessParse::analyzer(char *words)</p><p><b> {</b></p><p> int
94、 index=0;//字符指針</p><p> int marki=-1;//標(biāo)記找到的字符</p><p> int markj=-1;</p><p> while(words[index]!='#')</p><p><b> {</b></p><p><b
95、> //搜索二維表</b></p><p> marki=seektoken(astack.stackwords[astack.stack_top]);</p><p> markj=seektoken(words[index]);</p><p> if(markj!=-1)//判斷字符是否在二維表內(nèi)</p><p&g
96、t;<b> {</b></p><p> if(atoken[marki].relation[markj]!=-1)</p><p><b> {</b></p><p> if(atoken[marki].relation[markj]!=2)</p><p><b> {
97、</b></p><p> //壓入堆棧并調(diào)整指針</p><p> astack.stack_top++;</p><p> if (atoken[marki].relation[markj]==1)</p><p> astack.stackwords[astack.stack_top]='<';
98、</p><p><b> else</b></p><p> astack.stackwords[astack.stack_top]='=';</p><p> astack.stack_top++;</p><p> astack.stackwords[astack.stack_top]=wo
99、rds[index];</p><p><b> index++;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> pop_
100、stack();</p><p><b> }</b></p><p><b> }</b></p><p><b> else</b></p><p><b> return 0;</b></p><p><b>
101、; }</b></p><p><b> else</b></p><p> return 0; </p><p><b> }</b></p><p> if (astack.stackwords[astack.stack_top]='#')//字符串是否滿足
102、要求</p><p><b> return 1;</b></p><p><b> else</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> int
103、main(int argc, char* argv[])</p><p><b> {</b></p><p> ProcessParse processParse;</p><p> char userinput[maxsize];</p><p> processParse.initial();</p&
104、gt;<p> printf("請輸入字符串以#號結(jié)束:");</p><p> scanf("%s",userinput);</p><p> if (processParse.analyzer(userinput)>0)//調(diào)用程序</p><p> printf("字符輸入合法\n&
105、quot;);</p><p><b> else</b></p><p> printf("非法輸入\n");</p><p><b> return 0;</b></p><p><b> }</b></p><p>
106、3.4 程序運行截圖</p><p><b> 3.5 小結(jié)</b></p><p><b> 4 LR分析</b></p><p><b> 4.1 LR文法</b></p><p> ?。?)S'->S(注:該文法為示例,可更改)</p&g
107、t;<p><b> ?。?)S->BB</b></p><p><b> ?。?)B->aB</b></p><p><b> ?。?)B->b</b></p><p> 4.2 LR分析表</p><p> 4.3 分析程序代碼<
108、;/p><p> 程序要求:用戶輸入一個符號串,程序判斷是否為給定方法的句子。</p><p> 五號字,固定值12磅行間距。</p><p><b> 程序要有注釋</b></p><p> #include"stdio.h"</p><p> #include &qu
109、ot;string.h" </p><p> #define maxsize 20</p><p><b> //定義堆棧結(jié)構(gòu)</b></p><p> struct state_stack</p><p><b> {</b></p><p> int
110、members[maxsize];</p><p> int stack_top;</p><p><b> };</b></p><p> struct temp_stack</p><p><b> {</b></p><p> char members[max
111、size];</p><p> int stack_top;</p><p><b> };</b></p><p><b> //定義二維關(guān)系表</b></p><p> struct tokens</p><p><b> {</b><
112、;/p><p><b> bool ifR;</b></p><p> int stat_num[5];</p><p><b> };</b></p><p><b> //產(chǎn)生式</b></p><p> struct produce<
113、/p><p><b> {</b></p><p> int pro_num;</p><p> char prod[3];</p><p> char token;</p><p><b> };</b></p><p> class LLR
114、Parse</p><p><b> {</b></p><p><b> public:</b></p><p> void initial();</p><p> int seektoken(char word);</p><p> int pop_stack(
115、int num);</p><p> int analyzer(char *words);</p><p><b> private:</b></p><p> struct state_stack astack;</p><p> struct temp_stack tstack;</p><
116、;p> struct tokens atoken[7];</p><p> struct produce aprod[3];</p><p><b> };</b></p><p><b> //定義全局變量</b></p><p><b> //初始化數(shù)據(jù)</b&g
117、t;</p><p> void LLRParse::initial()</p><p><b> {</b></p><p><b> //初始化堆棧</b></p><p> astack.stack_top=0;</p><p> astack.members
118、[0]=0;</p><p> tstack.stack_top=0;</p><p> tstack.members[0]='#';</p><p><b> //初始化產(chǎn)生式</b></p><p> aprod[0].pro_num=2;</p><p> apro
119、d[0].token='S';</p><p> strcpy(aprod[0].prod,"BB");</p><p> aprod[1].pro_num=2;</p><p> aprod[1].token='B';</p><p> strcpy(aprod[1].prod,&
120、quot;Ba");</p><p> aprod[2].pro_num=1;</p><p> aprod[2].token='B';</p><p> strcpy(aprod[2].prod,"b");</p><p><b> //初始化二維表</b><
121、/p><p> atoken[0].ifR=false;</p><p> atoken[0].stat_num[0]=3;</p><p> atoken[0].stat_num[1]=4;</p><p> atoken[0].stat_num[2]=-1;</p><p> atoken[0].stat_n
122、um[3]=1;</p><p> atoken[0].stat_num[4]=2;</p><p> atoken[1].ifR=false;</p><p> atoken[1].stat_num[0]=-1;</p><p> atoken[1].stat_num[1]=-1;</p><p> ato
123、ken[1].stat_num[2]=100;</p><p> atoken[1].stat_num[3]=-1;</p><p> atoken[1].stat_num[4]=-1;</p><p> atoken[2].ifR=false;</p><p> atoken[2].stat_num[0]=3;</p>
124、<p> atoken[2].stat_num[1]=4;</p><p> atoken[2].stat_num[2]=-1;</p><p> atoken[2].stat_num[3]=-1;</p><p> atoken[2].stat_num[4]=5;</p><p> atoken[3].ifR=fals
125、e;</p><p> atoken[3].stat_num[0]=3;</p><p> atoken[3].stat_num[1]=4;</p><p> atoken[3].stat_num[2]=-1;</p><p> atoken[3].stat_num[3]=-1;</p><p> atoke
126、n[3].stat_num[4]=6;</p><p> atoken[4].ifR=true;</p><p> atoken[4].stat_num[0]=2;</p><p> atoken[4].stat_num[1]=2;</p><p> atoken[4].stat_num[2]=2;</p><p&
127、gt; atoken[4].stat_num[3]=-1;</p><p> atoken[4].stat_num[4]=-1;</p><p> atoken[5].ifR=true;</p><p> atoken[5].stat_num[0]=0;</p><p> atoken[5].stat_num[1]=0;</p
128、><p> atoken[5].stat_num[2]=0;</p><p> atoken[5].stat_num[3]=-1;</p><p> atoken[5].stat_num[4]=-1;</p><p> atoken[6].ifR=true;</p><p> atoken[6].stat_num
129、[0]=1;</p><p> atoken[6].stat_num[1]=1;</p><p> atoken[6].stat_num[2]=1;</p><p> atoken[6].stat_num[3]=-1;</p><p> atoken[6].stat_num[4]=-1;</p><p><
130、;b> }</b></p><p> int LLRParse::seektoken(char word)</p><p><b> {</b></p><p> switch(word)</p><p><b> {</b></p><p>
131、case 'a':return 0;</p><p> case 'b': return 1;</p><p> case '#': return 2;</p><p> case 'S': return 3;</p><p> case 'B': ret
132、urn 4;</p><p> default:return -1;</p><p><b> }</b></p><p><b> }</b></p><p> int LLRParse::pop_stack(int num)</p><p><b>
133、{</b></p><p> bool compare=true;</p><p><b> int i=0;</b></p><p> int temstate=0;</p><p> /*for(i=0;i<aprod[num].pro_num;i++)</p><p&g
134、t;<b> {</b></p><p> if(tstack.members[tstack.stack_top-i]!=aprod[num].prod[i])</p><p><b> false;</b></p><p><b> }*/</b></p><p>
135、 //判斷是否有歸約的字符串</p><p> if (compare==true) </p><p><b> {</b></p><p><b> //指針向下跳轉(zhuǎn)</b></p><p> astack.stack_top=astack.stack_top-aprod[num].pro
136、_num;</p><p> tstack.stack_top=tstack.stack_top-aprod[num].pro_num;</p><p><b> //壓入堆棧</b></p><p> tstack.stack_top++;</p><p> tstack.members[tstack.stac
137、k_top]=aprod[num].token;</p><p> temstate=atoken[astack.members[astack.stack_top]].stat_num[seektoken(aprod[num].token)];</p><p> if (temstate==-1)</p><p><b> return 0;<
138、;/b></p><p> astack.stack_top++;</p><p> astack.members[astack.stack_top]=temstate;</p><p><b> return 1;</b></p><p><b> }</b></p>
139、<p><b> else</b></p><p> return 0;</p><p><b> }</b></p><p> int LLRParse::analyzer(char *words)</p><p><b> {</b></p>
140、;<p> int index=0;//字符指針</p><p> int mark=0;//標(biāo)記找到的狀態(tài)</p><p> int tempnum=0;</p><p> while(astack.members[astack.stack_top]!=100)</p><p><b> {</b&g
141、t;</p><p><b> //搜索二維表</b></p><p> mark=seektoken(words[index]);</p><p> if (mark==-1)</p><p><b> return 0;</b></p><p> tempnum
142、=atoken[astack.members[astack.stack_top]].stat_num[mark];</p><p> if(tempnum!=-1)//判斷字符是否在二維表內(nèi)</p><p><b> {</b></p><p> if(atoken[astack.members[astack.stack_top]].if
143、R==false)</p><p><b> {</b></p><p> astack.stack_top++;</p><p> astack.members[astack.stack_top]=tempnum;</p><p> tstack.stack_top++;</p><p>
144、; tstack.members[tstack.stack_top]=words[index];</p><p><b> index++;</b></p><p><b> }</b></p><p><b> else</b></p><p><b>
145、{</b></p><p> if (pop_stack(tempnum)==0)</p><p><b> return 0;</b></p><p><b> }</b></p><p><b> }</b></p><p>
146、;<b> else</b></p><p><b> return 0;</b></p><p><b> }</b></p><p><b> return 1;</b></p><p><b> }</b></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)方式做保護處理,對用戶上傳分享的文檔內(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
提交評論