版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、宣城校區(qū)實(shí) 驗(yàn) 報(bào) 告課 程 名 稱 編譯原理 專 業(yè) 班 級(jí) 計(jì)算機(jī)0001班 學(xué)生姓名及學(xué)號(hào) 趙保飛 2015216768 指 導(dǎo) 教 師 李芒宏 實(shí) 驗(yàn) 地 點(diǎn) 計(jì)算機(jī)中心樓第四機(jī)房 2017 2018 學(xué)年第 一 學(xué)期編譯原理課程實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)名稱詞法分析設(shè)計(jì)姓 名趙保飛系院專業(yè)計(jì)算機(jī)科學(xué)與技術(shù)班級(jí)計(jì)算機(jī)01班學(xué)號(hào)2015216768實(shí)驗(yàn)日期2017.10.18指導(dǎo)教師李芒宏成績(jī)一、實(shí)驗(yàn)?zāi)康暮鸵笸ㄟ^本實(shí)驗(yàn)的編程實(shí)踐,使學(xué)生了解詞法分析的任務(wù),掌握詞法分析程序設(shè)計(jì)的原理和構(gòu)造方法,使學(xué)生對(duì)編譯的基本概念、原理和方法有完整的和清楚的理解,并能正確地、熟練地運(yùn)用。二、實(shí)驗(yàn)原理(1)實(shí)驗(yàn)數(shù)據(jù)結(jié)
2、構(gòu)說明KString數(shù)組-關(guān)鍵字表;schar數(shù)組分界符;mchar數(shù)組算術(shù)運(yùn)算符;rString數(shù)組關(guān)系運(yùn)算符;ArrayList型String數(shù)組ci常數(shù);ArrayList型String數(shù)組id標(biāo)識(shí)符(2)實(shí)驗(yàn)算法描述(3)算法流程圖三、源程序代碼和測(cè)試結(jié)果package lexicalAnalysis;import java.util.*;import java.io.*;public class lexicalAnalysis static String k="for","main","if","while&quo
3、t;,"void","public","static","printf","scanf","asm","do","return","typedef","auto","double","break","short","using","default","long"/關(guān)鍵字stati
4、c char s=',','','(',')','','','',''/2分界符static char m='+','-','*','/'/3算術(shù)運(yùn)算符static String r="<","<=","=",">",">=","<>"/4關(guān)系運(yùn)算符A
5、rrayList<String> ci=new ArrayList<String>();/5常數(shù)ArrayList<String> id=new ArrayList<String>();/6標(biāo)識(shí)符String tempToken=""/臨時(shí)存放組成一個(gè)“詞”單位串int pint ,row = 1,line = 1;/當(dāng)前指針指示,行數(shù),列數(shù)char ch;/存放最新讀入源程序字符String instring;/存放輸入de源程序代碼public static void main(String args)throws Exc
6、eption/ TODO Auto-generated method stublexicalAnalysis one = new lexicalAnalysis();System.out.println("單詞"+"t二元序列"+"t類 型"+"t位置(行,列)");one.readtext();boolean isdigit(char c)/判斷所讀字符是否為數(shù)字,是則返回ture,否則返回falseif(c>=48 && c<=57 )return true;elsereturn f
7、alse;boolean isletter(char c)/判斷所讀字符是否為字母,是則返回true,否則返回falseif(c>64&&c<91)|(c>96&&c<123)return true;elsereturn false;boolean isline(char c)/判斷字符c是否是下劃線"_" if(c='_') return true; else return false; boolean remove()/用于在判斷關(guān)系運(yùn)算符時(shí),判斷是否是要再讀一個(gè)字符 char b=instring
8、.charAt(pint+1);/string類charAt() 方法用于返回指定索引處的字符。索引范圍為從 0 到 length()-1if(b='='|b='>')/當(dāng)其后的字符是=或>時(shí),要再讀一個(gè)字符。否則不要再讀。 return true;else return false; void clearBlank()/檢查空白直到讀入字符非空白 while(ch=' ') getchar(); void getchar()pint+;if(pint <= instring.length()-1)ch=instring.cha
9、rAt(pint);if(ch = 'n')change_row_line();getchar();elsech=' '/instring數(shù)據(jù)讀取完,需重新讀入void retract()/讀入前一個(gè)字符 pint-; ch=instring.charAt(pint); void distinguishLeter()/識(shí)別字符串tempToken=""/清空while(isletter(ch) | isdigit(ch) | isline(ch)/字母,數(shù)字,下劃線仍是字符串合法組成,繼續(xù)識(shí)別tempToken=tempToken + ch;
10、getchar();void distinguishDigit()/識(shí)別數(shù)字串 tempToken=""/先將strtoken置空 while(isdigit(ch)/當(dāng)數(shù)字時(shí)繼續(xù)識(shí)別數(shù)字串 tempToken=tempToken+ch;/將新識(shí)別的字符加到strtoken后 getchar(); if(isletter(ch)|isline(ch)/識(shí)別完數(shù)字串而其后是字母,下劃線時(shí)出錯(cuò)處理 while(isletter(ch)|isline(ch)|isdigit(ch)/當(dāng)是字母,數(shù)字,下劃線時(shí)繼續(xù)識(shí)別錯(cuò)誤數(shù)字串 tempToken=tempToken+ch;/將新識(shí)
11、別的字符加到strtoken后 getchar(); display(0,tempToken,' ');/輸出錯(cuò)誤數(shù)字串 tempToken=""/將strtoken置空返回 void display(int i,String s,char a)/各種輸出處理 switch(i) case -1:System.out.println(a+"tError"+"tError"+"t"+row+","+line+")"); break; case 0:System.
12、out.println(s+"tError"+"tError"+"t("+row+","+line+")"); break; case 1:System.out.println(s+"t(1,"+s+")"+"t關(guān)鍵字 "+"t("+row+","+line+")"); break; case 2:System.out.println(a+"t(2,"+a+
13、")"+"t分界符"+"t("+row+","+line+")"); break; case 3:System.out.println(a+"t(3,"+a+")"+"t算術(shù)運(yùn)算符"+"t("+row+","+line+")"); break; case 4:System.out.println(s+"t(4,"+s+")"+"
14、t關(guān)系運(yùn)算符 "+"t("+row+","+line+")"); break; case 5:System.out.println(s+"t(5,"+s+")"+"t常數(shù)"+"t"+"("+row+","+line+")"); break; case 6:System.out.println(s+"t(6,"+s+")"+"t標(biāo)識(shí)符&qu
15、ot;+"t("+row+","+line+")"); break; line+;/列數(shù)加一 void change_row_line()/改變行數(shù)和列數(shù)row+;line=1;void handleString()/輸入串處理pint=-1;/將搜索指示器置-1System.out.println("要處理的語句為 : "+instring);getchar();/讀入一個(gè)字符while(pint<instring.length()/當(dāng)搜索指示器沒有越界時(shí)clearBlank();/檢查空白直到讀入讀入非空
16、if(isdigit(ch)/當(dāng)ch為數(shù)字時(shí)進(jìn)行數(shù)字串識(shí)別distinguishDigit();/數(shù)字串識(shí)別if(tempToken.length()!=0)/經(jīng)過數(shù)字串識(shí)別后,如果strtoken不為空if(reseverci(tempToken)=-1)/如果strtoken不在ci表中,將strtoken加入ci表中ci.add(tempToken);/將strtoken加入ci表中display(5,tempToken,' ');/輸出數(shù)字串else /如果strtoken在ci表中,僅輸出display(5,tempToken,' ');/輸出數(shù)字串e
17、lse if(isletter(ch)/當(dāng)ch為字母時(shí)進(jìn)行字符串識(shí)別distinguishLeter();/字符串識(shí)別if(reserve(tempToken)=-1)/如果strtoken不在k表中if(reseverid(tempToken)=-1)/如果strtoken不在id表中id.add(tempToken);/將strtoken加入id表中display(6,tempToken,' ');/輸出標(biāo)識(shí)串else /如果strtoken在id表中display(6,tempToken,' ');/輸出標(biāo)識(shí)串else /如果strtoken在關(guān)鍵字表di
18、splay(1,tempToken,' ');/輸出關(guān)鍵字else if(in_s(ch)!=-1)/分界符處理包含在one.in_s(one.ch)中 else if(in_m(ch)!=-1)/算術(shù)運(yùn)算符處理包含在one.in_m(one.ch)中else if(in_k(ch)!=-1)/關(guān)系運(yùn)算符處理包含在one.in_k(one.ch)中elsedisplay(-1, "",ch);/errorgetchar();/讀下一位int reserve(String s)/判斷字符串是否是保留字int i;for(i=0;i<k.length;i+
19、)if(s.equals(ki)return i;/是保留字,就返回編碼return -1;/不是保留字,就返回-1int reseverid(String s)/判斷識(shí)別的標(biāo)志符是否已經(jīng)在id表中int i;for(i=0;i<id.size();i+)if(s.equals(id.get(i)return i;/識(shí)別的標(biāo)志符已經(jīng)在id表中,返回位置return -1;/識(shí)別的標(biāo)志符不在id表中,返回-1int reseverci(String s)/判斷識(shí)別的數(shù)字串是否已經(jīng)在ci表中int i;for(i=0;i<ci.size();i+)if(s.equals(ci.get(
20、i)return i;/識(shí)別的數(shù)字串已經(jīng)在ci表中,返回位置return -1;/識(shí)別的數(shù)字串不在ci表中,返回-1int in_s(char c)/確認(rèn)分界符int i;for(i=0;i<s.length;i+)if(c=si)/與某個(gè)分界符配備時(shí)display(2, "",c);/輸出分界符getchar();/讀下一位return i;/返回所在位置return -1;/不在分界符表中int in_m(char c)/查找算術(shù)運(yùn)算符int i;for(i=0;i<m.length;i+)if(c=mi)/與某個(gè)算術(shù)運(yùn)算符配備時(shí)display(3, &qu
21、ot;",c);/輸出算術(shù)運(yùn)算符getchar();/讀下一位return i;/返回所在位置return -1;/不在算術(shù)運(yùn)算符表中int in_k(char b)/查找關(guān)系運(yùn)算符int i;if(remove()=false)/讀下一位為假時(shí),進(jìn)行一位關(guān)系運(yùn)算符識(shí)別for(i=0;i<r.length;i+)if(ri.length()=1)/當(dāng)關(guān)系運(yùn)算符為一位時(shí),嘗試匹配 if(ri.equals(Character.toString(b)display(4, ri,' ');/輸出關(guān)系運(yùn)算符getchar();/讀下一位return i;/返回所在位置e
22、lse/讀下一位為假時(shí),進(jìn)行兩位關(guān)系運(yùn)算符識(shí)別char a=new char2;/將兩位字符放入a中a0=b;getchar();a1=ch;for(i=0;i<r.length;i+)if(ri.length()=2)/當(dāng)關(guān)系運(yùn)算符為兩位時(shí),嘗試匹配if(ri.equals(String.copyValueOf(a)display(4, ri,' ');/輸出關(guān)系運(yùn)算符getchar();/讀下一位return i;/返回所在位置retract();/兩位關(guān)系運(yùn)算符匹配失敗,讀入前一個(gè)字符return -1;/不在關(guān)系運(yùn)算表中void readtext()throws
23、Exception/從文本讀入源程序String pathname = "C:UsersYodaDesktopcode.txt"File filename = new File(pathname);InputStreamReader reader = new InputStreamReader(new FileInputStream(filename);BufferedReader br = new BufferedReader(reader);instring = ""instring=br.readLine();while(instring!=nul
24、l)handleString();/處理讀入的源程序change_row_line();instring=br.readLine();四、實(shí)驗(yàn)評(píng)價(jià)、收獲與體會(huì)紙上得來終覺淺,雖然詞法分析器是理論上實(shí)行最簡(jiǎn)單的,但是編寫程序?qū)崿F(xiàn)時(shí)卻也遇到了不少的問題。使用JAVA來寫是因?yàn)檫@學(xué)期正在開這門課,數(shù)據(jù)的讀入還是自己提前看才實(shí)現(xiàn)的,讀入的一條源代碼看似簡(jiǎn)單,首先要儲(chǔ)存,儲(chǔ)存后要清楚空格直到讀到字符為止,還是以C+的思維來寫java程序,其中很多細(xì)節(jié)均是通過函數(shù)來實(shí)現(xiàn)。這也許自己沒有深刻理解java設(shè)計(jì)思維的原因。希望以后能改進(jìn)。編譯原理課程實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)名稱LL(1)分析法姓 名趙保飛系院專業(yè)計(jì)算機(jī)科學(xué)
25、與技術(shù)班級(jí)計(jì)算機(jī)01班學(xué)號(hào)2015216768實(shí)驗(yàn)日期10.25指導(dǎo)教師李芒宏成績(jī)一、實(shí)驗(yàn)?zāi)康暮鸵髲?fù)變函數(shù)。編譯原理實(shí)驗(yàn)和預(yù)習(xí)。java作業(yè)和實(shí)驗(yàn)。操作系統(tǒng)復(fù)習(xí)。通過完成預(yù)測(cè)分析法的語法分析程序,了解預(yù)測(cè)分析法和遞歸子程序法的區(qū)別和聯(lián)系。使學(xué)生了解語法分析的功能,掌握語法分析程序設(shè)計(jì)的原理和構(gòu)造方法,訓(xùn)練學(xué)生掌握開發(fā)應(yīng)用程序的基本方法。有利于提高學(xué)生的專業(yè)素質(zhì),為培養(yǎng)適應(yīng)社會(huì)多方面需要的能力。二、實(shí)驗(yàn)原理文法為(1)E->TG(2)G->+TG|-TG(3)G->(4)T->FS(5)S->*FS|/FS(6)S->(7)F->(E)(8)F->
26、;i(1)實(shí)驗(yàn)數(shù)據(jù)結(jié)構(gòu)說明Char數(shù)組-Vn數(shù)組-非終結(jié)符表;char數(shù)組-Vt數(shù)組-終結(jié)符;String數(shù)組-Gr數(shù)組-文法;Boolean型FIRST二維數(shù)組對(duì)應(yīng)每個(gè)非終結(jié)符的first集,初始化均為false;Boolean型FOLLOW二維數(shù)組對(duì)應(yīng)每個(gè)非終結(jié)符的Follow集,初始化均為false;String型M二維數(shù)組對(duì)應(yīng)預(yù)測(cè)分析表(2)實(shí)驗(yàn)算法描述算法總的來講不是很復(fù)雜,但是細(xì)節(jié)上可能有點(diǎn)復(fù)雜。總的是依據(jù)本實(shí)驗(yàn)的數(shù)據(jù)結(jié)構(gòu)FIRST和FOLLOW集,這兩個(gè)數(shù)據(jù)結(jié)構(gòu)雖然浪費(fèi)了不少空間但是確實(shí)讓程序的實(shí)現(xiàn)變得更簡(jiǎn)單。First()總的來求所有的非終結(jié)符的first集,first1()分
27、工為具體求某一個(gè)具體非終結(jié)符的first集;first2()則是求某一個(gè)集體的產(chǎn)生式的first集。通過這三個(gè)函數(shù)的逐級(jí)分工來實(shí)現(xiàn)求所有的非終結(jié)符的first集。Follow集來說相對(duì)難求一點(diǎn),但把它放到first集后面求來說相對(duì)簡(jiǎn)單一點(diǎn)。通過上面的分布設(shè)計(jì)就可以實(shí)現(xiàn)了。(3)算法流程圖三、源程序代碼和測(cè)試結(jié)果package exp3;import javax.swing.*;import java.awt.*;import java.awt.GridLayout.*;import java.awt.event.ActionEvent;import java.awt.event.ActionL
28、istener;class WinGrid extends JFrameGridLayout grid ;JPanel chessboard;JTextField text; JTextArea textShow; JButton button; ReaderListen listener;WinGrid()init();setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); void init() setLayout(new FlowLayout(); text = new JTextField(10); setBo
29、unds(466,166,500,400); button = new JButton("讀取"); textShow = new JTextArea(9,30); listener = new ReaderListen(); listener.setJTextField(text); listener.setJTextArea(textShow); text.addActionListener(listener); button.addActionListener(listener); add(text); add(button); add(new JScrollPane
30、(textShow); class ReaderListen implements ActionListener JTextField text; JTextArea textShow; LL one=new LL(); String s;String temp1= new String186; public void setJTextField(JTextField text) this.text = text; public void setJTextArea(JTextArea textShow) this.textShow = textShow; public String S() S
31、tring t = text.getText(); return t; Override public void actionPerformed(ActionEvent e) try String s = text.getText()+"#" textShow.append(s+"n"); textShow.append("步驟"+"t"+"分析棧"+"t"+"剩余輸入串"+"t"+"所用產(chǎn)生式"+"t&q
32、uot;+"動(dòng)作"+"n"); one.right(s,temp1); for(int i = 0;i<18;i+) for(int k=0;k<5;k+) textShow.append(temp1ik+"t"); textShow.append("n"); catch (Exception e2) e2.printStackTrace(); public class exp3 public static void main(String args) / TODO Auto-generated met
33、hod stubnew WinGrid();package exp3;import java.util.*;import java.io.*;public class LL char Vn='E','T','G','F','S'/非終結(jié)符char Vt='+','-','*','/','(',')','i','#',''/終結(jié)符boolean FIRST=new boole
34、anVn.lengthVt.length+1;/bool型數(shù)組,初始化均為flase boolean FOLLOW=new booleanVn.lengthVt.length+1;/bool型 String M=new StringVn.lengthVt.length-1;/預(yù)測(cè)分析表String Gr="E->TG","G->+TG|-TG","G->","T->FS","S->*FS|/FS","S->","F->(E)
35、","F->i"/文法LL()first();/求first集 follow();/求follow集 buildM();/求預(yù)測(cè)分析表 int or(int i,String s)/返回該文法第i符號(hào)離他最近的在其右邊一個(gè)“|”位置 for(i=i+1;i<s.length();i+) if(s.charAt(i)='|') return i;/存在,就返回位置 return -1;/返回-1表示沒有“|”在其右邊 int vnNum(char c)/返回c在非終結(jié)符表中的位置 int i; for(i=0;i<Vn.length
36、;i+) if(c=Vni) return i;/在表中,就返回位置 return -1;/返回-1表示不在表中 int vtNum(char c)/返回c在終結(jié)符表中的位置 int i; for(i=0;i<Vt.length;i+) if(c=Vti) return i; return -1; void first2(String s, int j)/求關(guān)于某一個(gè)產(chǎn)生式s,關(guān)于第j個(gè)字符的的first集 int v=vnNum(s.charAt(0);/v是產(chǎn)生式左邊的非終結(jié)符所在序號(hào) int i; if(vtNum(s.charAt(j)!=-1)/若產(chǎn)生式右邊第一個(gè)為終結(jié)符 FI
37、RSTvvtNum(s.charAt(j)=true;/就把s.charAt(j)加入s.charAt(0)的first集 else/產(chǎn)生式右邊第一個(gè)為非終結(jié)符if(!FIRSTvnNum(s.charAt(j)Vt.length)first1(s.charAt(j);for(i=0;i<Vt.length;i+)if(FIRSTvnNum(s.charAt(j)i && Vti!='')FIRSTvi=true; if(vtNum('')!=-1)/終結(jié)符中有if(FIRSTvnNum(s.charAt(j)vtNum(''
38、;)if(j = s.length()-1)FIRSTvvtNum('')=true;return ;if(s.charAt(j+1)!='|')j+;first2(s,j);elseFIRSTvvtNum('')=true; void first1(char v)/求非終結(jié)符v關(guān)于該文法的first集 int i,j; String s; for(i=0;i<Gr.length;i+) s=Gri; if(s.charAt(0) = v) j=3; first2(s,j); while(or(j,s)!=-1&&j<
39、s.length() j=or(j,s); first2(s,j+1); FIRSTvnNum(v)Vt.length=true;/將fivn(v)Vt.length設(shè)為true,表示已求v的first集 void first()/求所有非終結(jié)符的first集 int i,j; for(i=0;i<Vn.length;i+)/遍歷非終結(jié)符表求各自first集 if(!FIRSTiVt.length) first1(Vni); void follow2(String s,int j)/求關(guān)于某一個(gè)產(chǎn)生式的follow集 int i; if(j=s.length()-1|(j<s.le
40、ngth()-1&&s.charAt(j+1)='|') if(s.charAt(0)!=s.charAt(j)/考察字符與產(chǎn)生式左邊的非終結(jié)符不同時(shí) if(!FOLLOWvnNum(s.charAt(0)Vt.length) follow1(s.charAt(0); for(i=0;i<Vt.length;i+)/產(chǎn)生式左邊的非終結(jié)符的follow集加到考察字符的follow集中 if(FOLLOWvnNum(s.charAt(0)i) FOLLOWvnNum(s.charAt(j)i=true; if(j<s.length()-1&&am
41、p;s.charAt(j+1)!='|') if(vtNum(s.charAt(j+1)!=-1)/該字符為終結(jié)符 if(VtvtNum(s.charAt(j+1)!='') FOLLOWvnNum(s.charAt(j)vtNum(s.charAt(j+1)=true; else for(i=0;i<Vt.length;i+)/該字符的first集中除的非終結(jié)符加入考察字符的follow集中 if(FIRSTvnNum(s.charAt(j+1)i&&Vti!='') FOLLOWvnNum(s.charAt(j)i=tr
42、ue; if(vtNum('')!=-1)/非終結(jié)符中有 if(s.charAt(0)=s.charAt(j) return; boolean m=true;/當(dāng)考察字符右邊的字符串的first集中有'',m為真,沒有時(shí),m為假 for(i=j+1;i<s.length();i+) if(vtNum(s.charAt(i)!=-1) m=false; break; if(s.charAt(i)='|') break; if(!FIRSTvnNum(s.charAt(i)vtNum('')/當(dāng)考察字符右邊的字符串中的有一非終結(jié)
43、符的first集中不含,m為假 m=false; if(m) if(!FOLLOWvnNum(s.charAt(0)Vt.length) follow1(s.charAt(0); for(i=0;i<Vt.length;i+)/產(chǎn)生式左邊的非終結(jié)符的follow集加到考察字符的follow集中 if(FOLLOWvnNum(s.charAt(0)i) FOLLOWvnNum(s.charAt(j)i=true; void follow1(char v)/求非終結(jié)符v關(guān)于該文法的follow集 if(v='E')/v為開始符號(hào)時(shí) FOLLOWvnNum(v)vtNum(
44、39;#')=true; int i,j; String s; for(i=0;i<Gr.length;i+) s=Gri; for(j=3;j<s.length();j+) if(s.charAt(j)=v)/產(chǎn)生式右邊有考察字符 follow2(s,j);/求關(guān)于該產(chǎn)生式的follow集 FOLLOWvnNum(v)Vt.length=true; void follow()/求所有非終結(jié)符的follow集 int i,j; for(i=0;i<Vn.length;i+)/非終結(jié)符的follow集未求時(shí) if(!FOLLOWiVt.length) follow1(V
45、ni); void MM(int j,int i,String s,int m)/將某一個(gè)產(chǎn)生式填入預(yù)測(cè)分析表中 char u=Gri.charAt(0); int k; if(vtNum(Gri.charAt(j)!=-1)/為終結(jié)符if(Gri.charAt(j)!='')/Gri.charAt(j)不為時(shí)將s加到Mvn(u)vt(Gri.charAt(j)中MvnNum(u)vtNum(Gri.charAt(j)=s;else/是 for(k=0;k<Vt.length-1;k+)/Gri.charAt(j)為,將屬于u的follow集的元素b的位置用s加到Mvn(
46、u)vt(b)中if(FOLLOWvnNum(u)k)MvnNum(u)k=s; else/Gri.charAt(j)為非終結(jié)符for(k=0;k<Vt.length-1;k+)/對(duì)于終結(jié)符a屬于Gri.charAt(j)的first集時(shí),將s加到Mvn(u)vt(a)中if(FIRSTvnNum(Gri.charAt(j)k)MvnNum(u)k=s;if(FIRSTvnNum(Gri.charAt(j)vtNum('')/當(dāng)屬于Gri.charAt(j)的first集時(shí),將屬于u的follow集的b將s加到Mvn(u)vt(b)中if(j=m-1)for(k=0;k&
47、lt;Vt.length-1;k+)if(FOLLOWvnNum(u)k)MvnNum(u)k=s;elsej=j+1; MM(j,i,s,m); void buildM()/構(gòu)造預(yù)測(cè)分析表 int i,j,m; String s; for(i=0;i<Gr.length;i+) j=3; while(j<Gri.length() m=or(j,Gri); if(m=-1) m=Gri.length(); s=Gri.substring(j, m);/將j到m-1賦值到s 截取一段字符(從索引出發(fā)) MM(j,i,s,m); j=m+1; void right(String s,S
48、tring t)/分析一個(gè)字符串是否符合該文法 Stack<Character> temp=new Stack<Character>();/分析棧 String tempp = t;/保存輸出臨時(shí)數(shù)組 String z; temp.setSize(20); temp.push(new Character('#');/初始化將#入棧 temp.push(new Character('E');/初始化將E入棧 char u,v; int i=0,j,k=0; String m,action="初始化",rule="
49、; " while(i < s.length() temppk0 = String.valueOf(k);/整數(shù)型變量賦值給字符串?dāng)?shù)組使用函數(shù)String.valueOF() u=s.charAt(i); String temp0_string ="" for(j=0;j<temp.size();j+) if(temp.get(j)!=null) temp0_string = temp0_string.concat(temp.get(j).toString(); temppk1 = temp0_string; temppk2 = s.substring(i); temppk3 = rule; temppk4 = action.toString(); v=temp.pop(); action="pop" if(vnNum(v)!=-1)/棧頂元素為非終結(jié)符時(shí) if(MvnNum(v)vtNum(u)!=null)/分析表中有產(chǎn)生式 m=MvnNum(v)vtNum(u); rule=v+"->"+m; if(!m.equals("&qu
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版物流合作合同文檔大全
- 洛陽科技職業(yè)學(xué)院《醫(yī)學(xué)遺傳學(xué)醫(yī)學(xué)細(xì)胞生物學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025地產(chǎn)公司土地合同管理辦法
- 商業(yè)零售設(shè)備電路改造合同
- 管道安裝腳手架施工合同范本
- 2025店鋪裝修合同常用版樣本
- 個(gè)人展會(huì)用車租賃協(xié)議
- 醫(yī)療衛(wèi)生服務(wù)采購招投標(biāo)樣本
- 地鐵安全乘車禮儀指南
- 環(huán)保工程項(xiàng)目管理準(zhǔn)則
- 鋼化玻璃的MSDS英文報(bào)告
- 大學(xué)生情緒管理1500字論文2篇
- 2023廣東省成人高考《英語》(高升專)考試卷及答案(單選題型)
- 《德米安 埃米爾 辛克萊年少時(shí)的故事》讀書筆記思維導(dǎo)圖PPT模板下載
- 年產(chǎn)萬噸天然飲用水生產(chǎn)項(xiàng)目可行性研究報(bào)告
- 臨床藥理學(xué)第十四章 腎功能不全臨床用藥
- YS/T 682-2008釕粉
- GB/T 5976-2006鋼絲繩夾
- 麗聲妙想英文繪本第一級(jí) My Dad課件
- 部編版五年級(jí)語文上-句子專項(xiàng)課件
- 初中語文人教九年級(jí)下冊(cè)《統(tǒng)一》PPT
評(píng)論
0/150
提交評(píng)論