版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、這是java編寫的C語言詞法分析器,我將核心代碼整理起來,準備放在QQ空間和博客上,目的是互相學習借鑒,希望可以得到高手改進。這個詞法分析器實現(xiàn)的功能有打開文件、保存文件、打開幫助文檔、文本域內(nèi)容的剪切和復制和黏貼、進行詞法分析程序的項目結(jié)構(gòu)如圖,Word類和Unidentifiable類是兩個JavaBean類,存放的參數(shù)有兩個row(整型)、word(String),row用于獲取行數(shù),word用于獲取標識符,LexerFrame是詞法分析器的界面類,Analyze封裝了進行詞法分析的核心代碼 ,doc文件夾放一個幫助文檔,當用戶點擊幫助按鈕時可以彈出來以幫助用戶使用。/核心程序:pack
2、age com.lexer;import java.util.ArrayList;/*120號為關(guān)鍵字,用下標表示,i+1就是其機器碼;2140號為操作符,用下標表示,i+21就是其機器碼;4160號為分界符,* 用下標表示,i+41就是其機器碼;用戶自定義的標識符,其機器碼為51;常數(shù)的機器碼為52;不可以識別的標識符,其機器碼為0*/public class Analyze /關(guān)鍵字private Stringkeyword="int","long","char","if","else",&
3、quot;for","while","return","break","continue","switch","case","default","float","double","void","struct","static","do","short"/運算符private Stringoperator=&q
4、uot;+","-","*","/","%","=",">","<","!","=","!=",">=","<=","+","-","&","&&","|","","&qu
5、ot;/分界符private String delimiter=",","","(",")","","","'",""",":","#"public Analyze() /* 判斷是否是數(shù)字*/public boolean isDigit(char ch)if(ch>='0'&&ch<='9')return true;e
6、lsereturn false;/* 判斷是否是字母的函數(shù)*/public boolean isLetter(char ch)if(ch>='a'&&ch<='z')|(ch>='A'&&ch<='Z')return true;elsereturn false;/* 判斷是否由兩個運算符組成*/public boolean isTwoOperator(String str,char ch)char lc;int flag=0;if(str.length()>1|str.
7、length()=0)/字符數(shù)大于2和無字符的情況return false;else/字符數(shù)等于2的情況lc=str.charAt(str.length()-1);if(ch='='&&(lc='>'|lc='<'|lc='='|lc='!')else if(ch='+'&&lc='+')else if(ch='-'&&lc='-')else if(ch='|'&&am
8、p;lc='|')else if(ch='&'&&lc='&')elsereturn false;/否就返回falsereturn true;/其它符號的情況都返回true/* 獲取關(guān)鍵字的機器碼*/public int getKeywordOpcodes(String str)int i;for(i=0;i<keyword.length;i+)if(str.equals(keywordi)break;if(i<keyword.length)return i+1;/返回關(guān)鍵字的機器碼elsereturn
9、 0;/* 獲取操作符的機器碼*/public int getOperatorOpcodes(String str) int i;for(i=0;i<operator.length;i+)if(str.equals(operatori)break;if(i<operator.length)return i+21;/返回操作符的機器碼elsereturn 0;/* 獲取分界符的機器碼*/public int getDelimiterOpcodes(String str)int i;for(i=0;i<delimiter.length;i+)if(str.equals(delim
10、iteri)break;if(i<delimiter.length)return i+41;/返回分界符的機器碼elsereturn 0;/* 判斷字符是否可以識別*/public boolean isIdent(String str)char ch;int i;for(i=0;i<str.length();i+)ch=str.charAt(i);/非數(shù)字串的情況和非由英文字母組成的字符串if(i=0&&!isLetter(ch)|(!isDigit(ch)&&!isLetter(ch) break;if(i<str.length()retur
11、n false;elsereturn true;/* 預處理函數(shù)*/public String preFunction(String str)String ts=""int i;char ch,nc;/這里的i<str.length()-1for(i=0;i<str.length()-1;i+)ch=str.charAt(i);nc=str.charAt(i+1);if(ch='n')/如果字符是換行符,將n換成$ch='$'ts=ts+ch;else if(ch=' '|ch='r'|ch=
12、9;t')if(nc=' '|nc='r'|ch='t')continue;/連續(xù)' '或者't'或者'r'的情況,直接跳過 elsech=' '/一個' '或者't'或者'r'的情況,將這些字符換成' ' ts=ts+ch;elsets=ts+ch;/將字符連起來ch=str.charAt(str.length()-1);if(ch!=' '&&ch!='r'&a
13、mp;&ch!='t'&&ch!='n')ts=ts+ch;return ts;/* 將字符串分成一個個單詞,存放在數(shù)組列表*/public ArrayList<Word> divide(String str)ArrayList<Word> list=new ArrayList<Word>();String s=""char ch;int i;int row=1;for(i=0;i<str.length();i+)ch=str.charAt(i);if(i=0&&
14、;ch=' ')/字符串的第一個字符continue;if(ch=' ')/' '或者't'或者'r'的情況if(s!="")list.add(new Word(row, s);s=""/置空elsecontinue;else if(isDigit(ch)|isLetter(ch)if(s=""|isDigit(s.charAt(s.length()-1)|isLetter(s.charAt(s.length()-1)s = s + ch;elselist
15、.add(new Word(row, s);s = ""s=s + ch;elseif(isTwoOperator(s, ch)/兩個運算符的情況s = s + ch;elseif(s=""&&ch!='$')s = s + ch;else if(s=""&&ch='$')/若檢測到$符號,就換行row+;/行數(shù)加一elselist.add(new Word(row, s);s = ""if(ch!='$')s=s + ch;elser
16、ow+;if(s!="")list.add(new Word(row, s);return list;/* 判斷字符串是數(shù)字串,單個字符,還是一個字符串 */public int check(String str)char ch;ch=str.charAt(0);if(ch>='0'&&ch<='9')return 1;/數(shù)字串if(str.length()=1)return 2;/單個字符elsereturn 3;/一個字符串/* 檢查字符串是否為數(shù)字串,返回其機器碼 */public int checkDigi
17、t(String str)int i;char ch;for(i=0;i<str.length();i+)ch=str.charAt(i);if(ch>'9'|ch<'0')break;if(i<str.length()return 0;/不可識別的情況elsereturn 52;/常數(shù)/* 檢查字符串是否為單個字符,返回其機器碼 */public int checkChar(String str)if(getOperatorOpcodes(str)!=0)/操作符return getOperatorOpcodes(str);else i
18、f(getDelimiterOpcodes(str)!=0)/分界符return getDelimiterOpcodes(str);else if(isIdent(str)return 51;/用戶自定義標識符的機器碼elsereturn 0;/不可以被識別的標識符,機器碼為0/* 檢查字符串是否為字符串,返回其機器碼*/public int checkString(String str)if(getOperatorOpcodes(str)!=0)/操作符return getOperatorOpcodes(str);else if(getKeywordOpcodes(str)!=0)/關(guān)鍵字r
19、eturn getKeywordOpcodes(str);else if(isIdent(str)return 51;/用戶自定義標識符的機器碼elsereturn 0;/不可以被識別的標識符,機器碼為0/*在界面類寫這個方法來調(diào)用方法/* 詞法分析*/public void doTokenizing()consoleTextArea.setText(null);ArrayList<Word> wlist=new ArrayList<Word>();ArrayList<Unidentifiable> ulist=new ArrayList<Uniden
20、tifiable>();String s,ts,str;Word word;int i;int opcodes=-1;int errorNum=0;int count=0;s=fileContentTextArea.getText();if(s.length()>1)ts=analyze.preFunction(s);wlist=analyze.divide(ts);values=new Stringwlist.size()3;while(wlist.size()>0)word=(Word)wlist.remove(0);str=word.getWord();i=analyze.check(str);switch (i) case 1:opcodes=analyze.checkDigit(str);break;case 2:opcodes=analyze.checkChar(str);break;case 3:opcodes=analyze.checkString(str);break;if(opcodes=0)Unidentifiable u=new Unidentifiable(word.getRow(), str); ulist.add(u);errorNum+;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度個人教育產(chǎn)品居間合同范本正規(guī)范4篇
- 二零二五年度車輛抵押貸款監(jiān)管協(xié)議3篇
- 二零二五版幼兒園幼兒體育活動組織與指導合同4篇
- 建筑裝飾設(shè)計合同(2篇)
- 工廠勞務合同范本(2篇)
- 全新業(yè)務2025年度融資租賃合同3篇
- 2025年度建筑工地挖掘機駕駛員勞動合同范本2篇
- 蘑菇水塔施工方案
- AI醫(yī)療應用研究模板
- 二零二五年度綠色環(huán)保抹灰材料供應承包合同4篇
- 《天潤乳業(yè)營運能力及風險管理問題及完善對策(7900字論文)》
- 醫(yī)院醫(yī)學倫理委員會章程
- xx單位政務云商用密碼應用方案V2.0
- 農(nóng)民專業(yè)合作社財務報表(三張報表)
- 動土作業(yè)專項安全培訓考試試題(帶答案)
- 大學生就業(yè)指導(高職就業(yè)指導課程 )全套教學課件
- 死亡病例討論總結(jié)分析
- 第二章 會展的產(chǎn)生與發(fā)展
- 空域規(guī)劃與管理V2.0
- JGT266-2011 泡沫混凝土標準規(guī)范
- 商戶用電申請表
評論
0/150
提交評論