編譯原理實驗報告_第1頁
編譯原理實驗報告_第2頁
編譯原理實驗報告_第3頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、編譯原理實驗報告13-3 班班級:計算機科學與技術(shù)學號:20xxxxx姓名:xx 完成日期:xxx日實驗一詞法分析設(shè)計一、功能描述:從原文件中讀入字符對文件中的各類字符進行詞法分析 統(tǒng)計行數(shù)和列數(shù)用于錯誤單詞的定位 打印出分析后的結(jié)果如果發(fā)現(xiàn)錯誤則報告出錯二、程序結(jié)構(gòu)描述:數(shù)組k存儲關(guān)鍵字 數(shù)組a存儲運算符數(shù)組b存儲關(guān)系運算符數(shù)組s存儲分解符 動態(tài)數(shù)組id存放標識符動態(tài)數(shù)組ci存放常數(shù)pi nt指針strtoken存放構(gòu)成單詞符號的字符串row行數(shù)line列數(shù)char ch字符變量,存放最新讀進的源程序字符GetChar()直到讀入非空true,否則返回falsetrue,否則返回falsev

2、oid GetChar() 將下一字符讀到ch中void GetBC檢查ch中的字符是否為空,若是,則調(diào)用void Retract指針回調(diào)一個字符位置,ch置空bool sdigit(char c) 判斷當前字符是否是數(shù)字,若是返回 bool isletter(char c) 判斷當前字符是否字母,若是返回int Reserve(String s)判斷s是否是保留字,若是返回編碼,否則返回-1void snum()識別數(shù)字串int ss(char c) 判斷字符c是否在分界符表中int sa(char x) 判斷字符c是否在運算符表中int sb(char x) 判斷字符c是否在關(guān)系運算符表中

3、void an alyze()輸入串分析處理三、詳細算法描述:菲劇kaihterlI驅(qū)卩,point卅(c.pointeO財?shù)椎徒惺壮鰡卧偹諮.UW1)詞裁井靳子樨序的簡化框圖四、測試結(jié)果else ifCssfch) else ifCsafc町 else ifCsbCch)else洱程序字符串:if I - 0 (hen n+;k <= 3b 知;outputf Gettharic static void moin WbrdAnoly q - new > cl analyzeO;單洞二元存列類型CZB (If.列)iftun(14)i(GJ)(1J)=他勻英至運知襯(13)Q(SF

4、0)(1,4)then(Ijhen)tlP5)nn)標識料(腳+aP+)(1J):(2,;)舟界哥(Ipa)a(6Pa)掠氓符(2J5< =(4P<=)(2P2)3bErrorError(2J)%ErrorError(2.4)(2J)好界符(2;S)1C2,;>(2.6)Servers 曰 Conwlt £31篤砧曰迴蘭匚五、實驗總結(jié)通過本次試驗,更深層次的理解了詞法分析器的作用以及實現(xiàn)過程,也對編 譯原理這門課有了更深的認識。在程序?qū)崿F(xiàn)的過程中,狀態(tài)轉(zhuǎn)換是重點,要詳細 地考慮到每一種情況,我在開始的時候就因為會忽略了標識符與保留字的區(qū)別浪 費了時間。其次要注意運算

5、符+、-還有關(guān)系運算符 <=和>=的判斷。最后要注意 各種出錯情況處理。實驗二LL(1)分析法一、LL(1)分析法的思想:當一個文法滿足LL(1)條件時,我們就可以為它構(gòu)造一個不帶回溯的自上而 下的分析程序,這個分析程序是有一組遞歸過程組成的,每個過程對應(yīng)文法的一個非終結(jié)符。實現(xiàn)LL(1)分析的一種有效的方法是使用一張分析表和一個棧進行 聯(lián)合控制。預(yù)測分析表是一個MA,a形式的矩陣,存儲著分析規(guī)則;棧 STACK用于存放文法符號。從棧頂取符號,按照分析表給出的規(guī)則進行有步驟的分析。 符合LL(1)分析法的文法:文法G的任意兩個具有相同左部的產(chǎn)生式 A >a |滿足下列條件:(

6、1) 文法不含左遞歸。(2) 如果a 供均不能推導出£,貝U FIRST(a ) A FIRST( B )=。(3) a和B至多有一個能推導出&(4) 如果 B * > 則 FIRST(a ) A FOLLOW(A)=將滿足上述條件的文法稱為LL(1)文法。二、程序結(jié)構(gòu)描述:數(shù)組char vt存儲終結(jié)符數(shù)組char vn存儲非終結(jié)符數(shù)組boolean First存放文法的 First集數(shù)組 boolean Follow存放文法的 Follow 集數(shù)組 String Graphic構(gòu)建文法的 LL(1)分析表int vnoc(char c)返回c在非終結(jié)符表中的位置int

7、 vt_loc(char c)返回c在終結(jié)符表中的位置void first()求文法的 first 集void follow()求文法的 follow 集void graphic()構(gòu)建分析表void analyze()輸入串分析處理三、詳細算法描述:程序入取一»入符號筑丄取Tft人符號爼彈岀劇臍i號極從LL(4)預(yù)別分析程序壷程四、測試結(jié)果:tfCb = 'dA2. apper>d("£ij:ees 1 return;else>elseretutenp-Mk;public static voidString 呂; Scfluner reade

8、r s 丘reader,n«xt(LL1 a « new LL1C1知析快期余輸人申JS用產(chǎn)生朮#Ei+i*i#初緒優(yōu)rCTi+Pb*E->TGpor,pusH(cn*C$Fl+|*|r*T->F5W,PUSH(SF)3#-G5ii+rwF-»liTOP.PUSHdi)目#CS+i*i#GETNEXTCbSSC+i*i#S->iPOP&*GT+釗*WG->+TGPOP,PUSH(GT+)7ff-CTlBlfCETnEXTSISa*GSFi*i#T">FSiPOP.puSHtsn寸ffCSii*i#F->iiPO

9、P.PUSH(ii)10#GSr#GET1MEXTCI)11fCSF*5->5POP,PUSH(SF*|12rGSFCETNEXTg?n#CSIjifF->|ROPUSHd)14#C5GETNEXTO)IS#S->EPOP1£3f#G->ePOPsuccessr:i+i"i»mJJ Orrver.javaWordAr 猛人率:LLQ)分析馮!272273274275276277278279280281282283284285286287分析: 9 temp+;292d public10111213141516171819202122stat

10、ic 5 String s; Scanner rea s reoder LL1 a new 6 arwlyze(s:242526分析找剩余檢入氷所用產(chǎn)生式幼作初始化#CTE->TGPOP.PUSH(CT)心Fi+i*(i+i/i»T->FSPOP.PUSH(SF)#CSiF->iPOP.PUSH(i)#GSCETNEXT(I)#CPOP#CT*C->*TCPOP.PUSH(CT)#GTi*(i4.i/iXCETNEXT(I)心Fl*(i+i/iXT->FSPOP.PUSH(SF)心jF->lPOP.PUSH(i)#GSCETNEXT(I)心廠S&g

11、t;FSPOP.PUSH(SF«)心FCETNEXTO)#GS>E(i+i/i>#F-XBPOP.PUSHOEO#CS>ECETNEXT(I)心)CTE->TCPOP.PUSH(CT)WGSJGSFi+i/WT->FSPOP.PUSH(SF)心81 l/0rF >iPOP. PUSH 心心i/MCETNEXT(I)心)CS->£POP心)CT+C->*TCPOP.PUSH(CT+)心)CTi/i»CETNEXT(I)心)CSFi/WT->FSPOP.PUSH(SF)心)CSIl/WF->iPOP. PUS

12、H #GS)CS/"CETNEXT(I)心心F/i>#S->/FSPOP.PUSH(SF/)心心FMCETNEXT(I)#CS)CSiiXF->iPOP.PUSH(i)#CS)CS>#CETNEXT(I)#c$>cS->POP#cs>>#C->POP心#CETNEXT(I)#c*SxPOP#GxPOP28M success!口 hropcw 黑 Servers QLL1 Java Applicati<xij /System/Utxary131415161718-boolean First口 = new boolean5 10

13、; boolean FoUowOQ = new boolean5 10; String Graphic口 new St ring 5 8;LLl(StriLL(lWt析習20212223242526272829303ie32Corc.cintProperties分析:01014出捐啦!Tttr F .1 F .1F-F i 析 T s s s TTSSSSSSS ECCCCCCCCCGCCCC #I*窮余輸人串i+i-ii#i*ii#i*ii#i*ii#ii#ii#ii#ii#所用產(chǎn)生式E->TG T->FS F->iS->E C->4TCT->F5 F-&

14、gt;iS->*FSF->i動作 初始化 POP.PUSH(CT) POP.PUSH(SF) POP.PUSH(i) CETNEXT(I) POP POP.PUSH(CT+) CETNEXT(I) POP.PUSH(SF) POP.PUSH(i) CETNEXT(I) POP,PUSH(SF*) CETNEXT(I) POP.PUSH(i) CETNEXT(I)五、實驗總結(jié):通過本次實驗,我深入了解了詞法分析器和LL(1)文法的預(yù)測分析法設(shè)的計和實現(xiàn)。LL(1)分析方法較難的地方是文法的First集和Follow集的求解。因為用到了大量的遞歸算法,而我對遞歸掌握的不是很透徹,因此花

15、費了許多時間。First集和Follow集求解成功后分析表的構(gòu)造就相對輕松,用棧來存放文法符號,當棧頂符號遇到輸入符號時要分好多 種情況,容易漏掉,出錯情況也要考慮周全。實驗三LR(1)分析法一、LR( 1)語法分析程序設(shè)計思想:(1) 總控程序,也可以稱為驅(qū)動程序。對所有的 LR分析器總控程序都是相同的。(2) 分析表或分析函數(shù),不同的文法分析表將不同,同一個文法采用的LR分析器 不同時,分析表將不同,分析表又可以分為動作表(ACTION )和狀態(tài)轉(zhuǎn)換(GOTO) 表兩個部分,它們都可用二維數(shù)組表示。(3) 分析棧,包括文法符號棧和相應(yīng)的狀態(tài)棧,它們均是先進后出棧。分析器的動作就是由棧頂狀態(tài)

16、和當前輸入符號所決定。二、程序結(jié)構(gòu)描述:數(shù)組char vt存儲終結(jié)符 數(shù)組char vn存儲非終結(jié)符boolean isvn(char c) 判斷字符 c是否為非終結(jié)符 boolean isvt(char c) 判斷字符 c是否為終結(jié)符 int ACTION。nt a,char b)狀態(tài)棧頂元素遇到終結(jié)符的動作 int GOTO(i nt a,char b)狀態(tài)棧頂元素遇到非終結(jié)符的動作void analyze(String s)輸入串s分析處理三、詳細的算法描述:U沖分別入衣態(tài)棧和杼號棧令保狀態(tài)挨機頂,&倉両楕向的特號把諭蟻分到犍入 符號棧和狀態(tài)桟; 便郭甬進到下一亍 字符.Wnll

17、-reduce 型分別從棧頂彈出|U|個 符號冷宙是當nt挨頂 狀態(tài),把n和q/q!軋4】 先姑鍵人挨中轉(zhuǎn)出產(chǎn) 主式A-AU.結(jié)出當處理四、測試結(jié)果:378ifCnAastElm&ntC)=咗豎 n.sizeQ = Z)(5ysteffl. out.print(,rAcc:功!");330break;3£11BZleielse ifCACTIONCj) 3)PfoperiirtSi 報 Servftfst-rrrriniitrd-* Lft L8910111213145 17 7 -7ijq rri凈® 呂馮占Jb -Hw05的配01血&1也機&a

18、mp;101肌aial符號找剩余桃人串動作說朋#弱”枝態(tài)5人棧+i*i#約,GOTDCdF) = H人棧#F+i 訃E:T-bF規(guī)妁,GOTOC0,T) - 2人橈岸T+i*t«r2:ET規(guī)樹"MTOC0:n = 1AK#E+i*i#s6,狀態(tài)6A棧LUs5Ftt態(tài)臥棧#E+i*t#r6:F->t規(guī)妁"GOTO(麗-1A«#E+FE:T-aF規(guī)妁,KJTDCg.T) 9A#E+T*i#s?ptt態(tài)7人棧#E+T*t#s5,U5A«#E+T*i»布:F-M規(guī)妁,GOT%hF) 10AE#E+T*FT:T-T隔妁,GOTOCCpT)

19、 -#E+TrXEoE+T規(guī)期 G0T0(ft,E)=認枝#E#Ah:好祈感功!:Pfflpenles 城J Servers COrlSOlf 腐Etm'iiha.Ud> LR1 Appli<Jitibn %lEerni/LibrArv/jAvA/JY-aViirlualMaehinit&/1.6.0.hJk/CahlfiUfHorTiei!b>ri/jjyji (20£蠢石Hl書日 ±I:2S.3QjY H13i+涉 10 1234567891234234567B91111 111 11122222005 03 BZ 01 016 01&

20、#163;S B163 0価01S16 01&4 01645 01G43 01642 016427 0164275 01642716 01642 ei64B 0164811 01甜 016901i 1- F T T T -1ft c c c c c c +*+*-+ 斷酹#T#E#E#E*E#E*E#E#E#E*E*E昶#E#E粧#E#E#E粧TEE c c c F T + + + + +劇S:輪入串 +i+<-i*O# i+Ci*O#+G-i+<i*i> i*i>p5#E+CT*F>sSSASr6:F-AE規(guī)釣* GOTOC0PFJ r4:T-»

21、;F疑的.COW0.T)= lE:E-aT眾対,GOKKBpE皚:F“i規(guī)約G0T0(6hF) = 3人桂 M:T-*FEi的,GOTO館<0 - §人槿 rl:EE+T規(guī)約60似0任)=1入噸 sGpttS6As4,狀態(tài)4人找話,妝態(tài)5人棧rEF-hl規(guī)約,GOT10(4tF) = 3人桟 M汀附理G0KK4/D2Aft $?,狀態(tài)7人棧狀態(tài)$人校帽:尸-沁規(guī)均,GCT0(7±F) = lBA- 占:TT"F規(guī)均.WTDC4J)rZ:E->TS, GCT0f4±E) E人桟r5:F->CE)規(guī)妁 G(mKE,F) - 3A r4:T“

22、F規(guī)的,G0T0(6tT) - 9A rl:E-E+股約"GOKK0PE - 1A疲 蔽吩析比功!3A2A1AtsA2i+i*Ci+i*(i-H-i)3*箱號踐雨柞說朝1Ut*Ci*VCi+*i»#15tW.$5 人樓z津iGOTO(叫 E)=耳人誓3r4:T->FS«a GOTOCArT) - 2扎棧4-#T+i%i 我應(yīng);EfTJSES GOTDC0PEJ LAiS5飢+i*Ci+i*Ci4+i)»sE(UiS6A4601670165耗+iGOTDC61F) - 3A5g飢心fM:TF規(guī)約"GDTDC6J - 9A«901W

23、庭斗Ts7a>t7Att1001697#+T*s4朋戀4入橫11飢的刊ft 41*(120165745ffi+r*G+i*Ci+i»#r6;F->iafip G0TDC4.F3 3A*S13169743妊寸T%FH:T->FSW? CDTDC43T) - 2A«14JME+T*(Tr2:E->TttftB GOTOQ4J) 旨人哎15016974B+t*Ci+in#lb飢関me#E+T*(E+1701S74B65#E+T*(E+i"i卄i)期r&FiSaSP GOTCIC6.F)18169743#E+T*CE+F規(guī)均.GOTOIdD

24、1901697469#e+t*(E+TZ9如的科硒7#E+T*CE+T*Ci+-i5)54ptt®4A«21#E+T-(E+T*(it+i)#s5,tt®SA«起ei«74&6974S#E+T*CE+T*(ir6;F->iSa GWC4.FJ 力MS23016974K9743#E+T*CE+T*fF+iB#網(wǎng): TjF規(guī)筠1, GOTOC4.T3 口 2A悝24«16974&69742«£+f(E+f(T*!»#r2:E->Tft3 GOTOC嘰 E) SAfl25#E:+T*

25、CE+T*CE2E#E+T*(E+T*(E+*!»岀W1五、實驗總結(jié)通過本次試驗,我對LR文法有了更深刻的認識。LR分析法的歸約過程是規(guī)范推導的逆過程,所以LR分析過程是一種規(guī)范歸約過程。LR分析法正是給出一種能根據(jù)當前分析棧中的符號串和向右順序查看輸入串的K個(K > 0)符號就可唯一地確定分析器的動作是移進還是歸約和用哪個產(chǎn)生式歸約,因而也就能唯一地確定句柄。其中LR(0)分析器是在分析過程中不需向右查看輸入符號,因而它對文法的限制較大,然而,它是構(gòu)造其它LR類分析器的基礎(chǔ)。當K=1時,已能滿足當前絕大多數(shù)高級語言編譯程序?qū)崿F(xiàn)的需要。LR(1)項目集族的構(gòu)造是LALR(1)

26、分析器的構(gòu)造原理和基礎(chǔ)。首先根據(jù)文法構(gòu)建 LR(1)項目集規(guī)范族,再根據(jù)項目集族構(gòu)建規(guī)范LR分析表,最后用狀態(tài)棧與符號棧兩個棧來分析輸入串,分析輸入串時有ACTION和GOTO兩個動作,要注意各種情況下的出錯處理。附錄:實驗一源代碼:import java.util.*;import java.awt.*;import javax.swi ng.*;public class WordA naly exte nds JFrameJTextArea A1 = new JTextArea();Stri ng k = "do","e nd","for&

27、quot;,"if","pri ntf',"sca nf","the n","while"ArrayList <Stri ng> id=new ArrayList<Stri ng>();ArrayList <Stri ng> ci=new ArrayList<Stri ng>();Stri ng a = "+","-","*","/","+",&quo

28、t;-"Stri ng b = "<","<=","=",">",">=","<>"char s =String in putstri ng;Stri ng strToke n =""char ch;int pint;int row;int line;WordA naly(Stri ng s)super(s);this.setSize(800,400);this.setVisible(true);Contain

29、er c = getC onten tPa ne();c.add(A1);in putstri ng = "if i = 0the n n+;na <= 3b %);"row = 1;line = 1;pint = -1;A1.appe nd(”源程序字符串:n");A1.appe nd(i nputstri ng+"nn ”);A1.append("分析:n");A1.append("t"+"單詞"+"tt"+"二元序列"+"tt&quo

30、t;+"類型"+"tt"+"位置(行,列) "+"n");void GetChar()pi nt+;if(pint < in putstri ng.len gth()ch = in putstri ng.charAt(p in t);if(ch = ' ; '| ch = 'n')n extrow();GetChar();else ch=''void n extrow()row+;lin e=1;void GetBC()while(ch = ' '

31、;)GetChar();void Retract()pi nt-;ch=in putstri ng.charAt(p in t);boolea n isdigit(char c)if(c >= 48 && c <= 57)return true;return false;boolea n isletter(char c)if(c >= 65 && c <= 90) | (c >= 97 && c <= 122) return true;return false;int Reserve(Stri ng s)int

32、 i;for(i=0;i < k.le ngth;i +)if(s.equals(ki)return i;return -1;int In sertid(Stri ng s)int i;for(i=0;i < id.size();i +) if(s.equals(id.get(i) return i;elseid.add(s);return -1;int In sertC on st(Stri ng s)int i;for(i = 0;i < ci.size();i+)if(s.equals(ci.get(i)return i;elseci.add(s);return -1;

33、void snum ()strToke n=""while(isdigit(ch)strToke n = strToke n+ch;GetChar();if(isletter(ch)while(isletter(ch)|isdigit(ch) strToke n = strToke n + ch; GetChar();output(0,strToke n,'');strToke n="”;void sn_l()strToke n=""while(isletter(ch)|isdigit(ch) strToke n = strTo

34、ke n + ch; GetChar();boolea n read next()char a = in putstri ng.charAt(p in t+1); if(a = '=' | a = '>')return true;return false;boolea n read next1()char a = in putstri ng.charAt(p in t+1); if(a = '+' | a = '-')return true;return false;int ss(char c)int i;for(i = 0

35、;i < sen gth;i+)if(c = si)output(2, "”,c);GetChar();return i;return -1;int sa(char x)int i;if(read next1() = false)for(i = 0;i < aen gth;i +)if(ai.le ngth() = 1) if(ai.equals(Character.toStri ng(x) output(3, ai,'');GetChar();return i;elsechar m = new char2;m0 = x;GetChar();m1 = ch

36、;for(i = 0;i < aen gth;i +)if(ai.le ngth() = 2) if(ai.equals(Stri ng.copyValueOf(m) output(3, ai,'');GetChar();return i;Retract();return -1;int sb(char x)int i;if(read next() = false)for(i = 0;i < ben gth;i +)if(bi.le ngth() = 1)if(bi.equals(Character.toStri ng(x)oufpuf?b 三z=Gefcharo 八

37、 recrne-se 宀char m= H new charE八mo一 H><Gefchaom三H oh八for(一 H 0= A bengfhT+) ifs二.CDngfho HH 2)宀 if(b 三.equa 更 s=ring.copyva-ueof(m)宀oufpuf?b 三z)八 Gefchaoref urnRefraco八 recrn >v-八swifchgA.append(=w-+a+=Fr-+=EITOr=+=Fr-+=EITOr=+>2=+=(=+row+=+=ne+=)=+-vr= break 八case 9A.append(=w-+s+>2=

38、+=EITOr=+>w-+-rTiITOr=+>w-+=(=+row+=+=ne+=)=+>n£ break 八case 1 -Al appends 違+s+>2=+=u=+s+=)=+=Fr-+=>M =+>2=+=(=+row+=+=ne+=)=+-vr=break 八case NAl appends 違+a+=Fr-+=(2=+a+=)=+=Fr-+= V 初 =+>2=+=(=+row+=+=ne+=)=+-vr=break 八case9?Al appends 違+s+>2=+=(3=+s+=)=+yw+=w應(yīng)=+>2=+

39、=(=+row+=+=ne+=)=+-vr=break 八A.append(=w-+s+>2=+=(4=+s+=)=+=Fr-+=>洲 應(yīng)w=+>2=+=(=+row+=+=ne+=)=+-vr= break 八 case 5 A.append(=w-+s+>2=+=(5=+s+=)=+=Fr-+=<蒲=+>2=+=(=+row+=+=ne+=)=+-vr= break 八casep?Al appends 違+s+>2=+=(6=+s+=)=+yw+=wt話=+>2=+=(=+row+=+=ne+=)=+-vr=break 八-ine+void

40、ana-yze()宀pinf H匕八Gefchapwhi-e(pinf A inpufsfring.-engfho)宀Gesco 八if(isdigif(ch)Msnum()八if(s=rToken.-engfh()'il0)宀-nsertconsf(s=rToken)八ouf puf(5ys=rT0kenz)八e-se if(is-efCDr(ch)x30if(Reserve(s=rToken) HH 匕)宀-nsertid(sfrToken)八o uf p uf (a s=rT0 ke nz)八e-se 宀o uf p uf?s=rTO ke nzxe-se if(ss(ch)Ha

41、宀 e-se if(sa(ch)H匕)宀e-se if(sb(ch)H匕)宀elseoutput(-1, "”,ch);GetChar();public static void main( Stri ng args)throws Excepti on WordAnaly a = new WordAnaly(” 詞法分析器!"); a.a nalyze();實驗二源代碼:import java.util.*;import java.awt.C ontainer;import javax.swi ng.JFrame;import javax.swi ng.JTextArea;p

42、ublic class LL1 exte nds JFrameJTextArea A2 = new JTextArea();Stri nggrammar"E->TG","G->+TG|-TG","G-> & ","T>FS","S->*FS|/FS","S- > £ ","F>(E)","F->i"char Vn = 'E','G',

43、9;T','S','F'char Vt = '+','- ','*','/','(',')','i','#','£ 'boolean First = new boolea n5 10; boolean Follow = new boolea n5 10; Stri ng Graphic = new Stri ng5 8;LL1(Stri ng s)super(s);this.setSize(600,40

44、0); this.setVisible(true);Container c=getC onten tPa ne(); c.add(A2);first();follow();graphic();int loc_vn( char c)for(i nt i = 0;i < 5;i +)if(c = Vn i)return i;return -1;int loc_vt(char c)for(i nt i = 0;i < 9;i +)if(c = Vti)return i;return -1;void first_of_each(Stri ng s, int p)int a = loc_vn

45、( s.charAt(O);if(loc_vt(s.charAt(p) != -1)Firstaloc_vt(s.charAt(p) = true;elseif(Firstloc_v n(s.charAt(p)9 != true)first_ of_vn( s.charAt(p);for(i nt i = 0;i < 9;i +)if(Firstloc_vn(s.ch arAt(p)i && Vti != '£ ')Firstai = true;if(Firstloc_vn(s.charAt(p)loc_vt('e ') = tr

46、ue)if(p = s.le ngth()-1)Firstaloc_vt('e ') = true;if(s.charAt(p+1) != '|')p +;first_of_each(s,p);elseFirstaloc_vt('e ') = true;void follow_of_each(Stri ng s,i nt p)if(p = s.le ngth()-1 | (p<s.le ngth()-1 && s.charAt(p+1) = '|')if(s.charAt(0) != s.charAt(p)i

47、f(!Followloc_v n(s.charAt(0)9)follow_of_v n(s.charAt(O);for(i nt i = 0;i < Vt.le ngth;i +)if(Followloc_v n(s.charAt(O)i) Followloc_v n( s.charAt(p)i = true;if(p < s.le ngth()-1 && s.charAt(p+1) != '|')if(loc_vt(s.charAt(p+1) != -1)Followloc_v n(s.charAt(p)loc_vt(s.charAt(p+1) =

48、 true;elsefor(i nt i = 0;i < 9;i+)if(Firstloc_vn(s.charAt(p+1)i&& Vti != '£ ')Followloc_v n( s.charAt(p)i = true;boolea n t = true;for(i nt i = p + 1;i < s.len gth();i +)if(loc_vt(s.charAt(i) != -1)t = false; break;if(s.charAt(i) = '|')break;if(!Firstloc_v n(s.char

49、At(i)loc_vt('&')t = false;if(t)if(!Followloc_v n(s.charAt(0)9)follow_of_vn(s.charAt(0);for(i nt i = 0;i < 9;i +)if(Followloc_v n(s.charAt(O)i)Followloc_v n( s.charAt(p)i = true;int locate(i nt i,Stri ng s)for(i = i + 1;i < s.len gth();i +) if(s.charAt(i) = '|') return i;ret

50、urn -1;void first_ of_vn( char c)for(i nt i = 0;i < grammar.le ngth;i+)Stri ng s = grammar" if(s.charAt(0) = c) int p = 3;first_of_each(s,p);while( locate(p,s) != -1 && p < s.le ngth() p = locate(p,s); first_of_each(s,p+1); Firstloc_vn(c)9 = true;void follow_ of_vn( char c )if(c =

51、 'E')Followloc_v n(c)loc_vt('#') = true;String s;for(i nt i = 0;i < grammaren gth;i +)s = grammari;for(i nt p = 3;p < s.le ngth();p +) if(s.charAt(p) = c ) follow_of_each(s,p);Followloc_v n(c )9 = true;void first()for(i nt i = 0;i < 5;i +) if(Firsti9 != true) first_of_v n(Vn

52、i);void follow()for(i nt i = 0;i < 5;i +)if(Followi9 != true) follow_ of_vn(Vn i);void add_to_gra(i nt p,i nt i,Stri ng s)char a = grammari.charAt(O);if(loc_vt(grammari.charAt(p) != -1) if(grammari.char At(p) != '& ')Graphicloc_v n( a)loc_vt(grammari.charAt(p) = s; else for(i nt k = 0

53、;k < 8;k+) if(Followloc_v n(a)k)Graphicloc_v n( a)k = s;elsefor(i nt k = 0;k < 8;k +)if(Firstloc_v n( grammari.charAt(p)k)Graphicloc_v n( a)k = s;£ ')if(Firstloc_v n(grammari.charAt(p)loc_vt('for(i nt k = 0;k < Vt.le ngth - 1;k +) if(Followloc_v n(a)k) Graphicloc_v n( a)k = s;v

54、oid graphic()in t p,l;String s;for(i nt i = 0;i < grammaren gth;i +)p = 3;while(p < grammari.le ngth()l = locate(p,grammari);if(l = -1)l = grammari.le ngth();s = grammari.substri ng(p, I);add_to_gra(p,i,s);p = l+1;void an alyze(Stri ng s)A2.append(” 輸入串:"+s+"n"+"分析:"+"n");A2.append(”步驟"+"t"+"分析棧"+"t"+"剩余輸入串"+"t"+"所用產(chǎn)

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論