编译原理——词法分析器
生活随笔
收集整理的這篇文章主要介紹了
编译原理——词法分析器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
采用java圖形化界面編寫了java語言的詞法分析器,該分析器可識別所有java關鍵字。軟件工程課程中編譯原理實驗。
Keyword.jvav package org.kyc.test1;public class Keyword {private String keyword; //存儲關鍵字字符private int keywordindex;//存儲關鍵字的下標Keyword[] keyW;//存儲關鍵字對象的數組public Keyword(){//構造數組keyW=setKeywordList();}public Keyword(String str,int t){setKeyword(str);setKeywordindex(t);}public String getKeyword() {return keyword;}public void setKeyword(String keyword) {this.keyword = keyword;}public int getKeywordindex() {return keywordindex;}public void setKeywordindex(int keywordindex) {this.keywordindex = keywordindex;}/*** 創建關鍵字列表* @return*/public Keyword[] setKeywordList(){final int PRIVATE=30;// private私有的final int PROTECTED=31;// protected受保護的final int PUBLIC=32 ;//public 公共的//類、方法和變量修飾符final int ABSTRACT=33;//abstract 聲明抽象final int ClASS=34;// class類final int EXTEND=35;//extends 擴允,繼承final int FINAL=36;//final 終極,不可改變的final int IMPLEMENTS=37;//implements實現final int INTERFACE=38;//interface 接口final int NATIVE=39;//native 本地final int NEW=40;//new 新,創建final int STATIC=41;//static 靜態 final int STRICTFP=42;//strictfp 嚴格,精準final int SYNCHRONIZED=43;//synchronized 線程,同步final int TRANSIENT=44;//transient 短暫final int VOLATILE=45;//volatile 易失//程序控制語句final int BREAK=46;//break 跳出循環final int CONTINUE=47;//continue 繼續final int RETURN=48;//return 返回final int DO=49;//do 運行final int WHILE=50;//while 循環final int IF=51;//if 如果final int ELSE=52;// else 反之final int FOR=53;//for 循環final int INSTANCEOF=54;//instanceof 實例final int SWITCH=55;//switch 開關final int CASE=56;//case 返回開關里的結果final int DEFAULT=57;//default 默認//錯誤處理final int CATCH=58;//catch 處理異常final int FINALLY=59;//finally 有沒有異常都執行final int THROW=60;//throw 拋出一個異常對象final int THROWS=61;//throws 聲明一個異常可能被拋出final int TRY=62;//try 捕獲異常//包相關final int IMPORT=63;//import 引入final int PACKAGE=64;//package 包//基本類型final int BOOLEAN=65;//boolean 布爾型final int BYTE=66;//byte 字節型final int CHAR=67;//char 字符型final int DOUBLE=68;//double 雙精度,final int FLOATE=69;//float 浮點final int INT=70;//int 整型final int LONG=71;//long 長整型final int SHORT=72;//short 短整型final int NULL=73;//null 空final int TRUE=74;//true 真final int FALSE=75;//false 假//變量引用final int SUPER=76;//;super 父類,超類final int THIS=77;//this 本類final int VOID=78;//void 無返回值final int CONST=80;//constfinal int GOTO=81;//gotoKeyword kwTable[] = { new Keyword("private", PRIVATE),new Keyword("protected", PROTECTED),new Keyword("public", PUBLIC),//類、方法和變量修飾符new Keyword("abstract" ,ABSTRACT), // 聲明抽象new Keyword("class", ClASS), // 類new Keyword("extends" ,EXTEND), // 擴允,繼承new Keyword("final" ,FINAL), // 終極,不可改變的new Keyword("implements" ,IMPLEMENTS), //實現new Keyword("interface", INTERFACE), // 接口new Keyword("native", NATIVE), // 本地new Keyword("new" ,NEW),// 新,創建new Keyword("static" ,STATIC), // 靜態 new Keyword("strictfp" , STRICTFP), //嚴格,精準new Keyword("synchronized",SYNCHRONIZED), // 線程,同步new Keyword("transient" ,TRANSIENT), // 短暫new Keyword("volatile" ,VOLATILE), // 易失//程序控制語句new Keyword("break" ,BREAK), // 跳出循環new Keyword("continue" ,CONTINUE), // 繼續new Keyword("return" , RETURN), //返回new Keyword("do" ,DO), // 運行"new Keyword("while" ,WHILE), //循環new Keyword("if",IF), // 如果new Keyword("else" ,ELSE), // 反之new Keyword("for" ,FOR), // 循環new Keyword("instanceof ",INSTANCEOF), // 實例new Keyword("switch ", SWITCH), //開關new Keyword("case", CASE), // 返回開關里的結果new Keyword("default", DEFAULT), // 默認//錯誤處理new Keyword("catch", CATCH), //處理異常new Keyword("finally", FINALLY), // 有沒有異常都執行new Keyword("throw", THROW), //拋出一個異常對象new Keyword("throws", THROWS), // 聲明一個異常可能被拋出new Keyword("try", TRY), // 捕獲異常//包相關new Keyword("import", IMPORT), // 引入new Keyword("package", PACKAGE), // 包//基本類型new Keyword("boolean", BOOLEAN), // 布爾型new Keyword("byte", BYTE), // 字節型new Keyword("char", CHAR), // 字符型new Keyword("double", DOUBLE), // 雙精度,new Keyword("float", FLOATE), // 浮點new Keyword("int", INT),// 整型new Keyword("long", LONG), // 長整型new Keyword("short", SHORT), // 短整型new Keyword("null", NULL), // 空new Keyword("true", TRUE), // 真new Keyword("false", FALSE), // 假//變量引用new Keyword("super", SUPER), //, 父類,超類new Keyword("this", THIS), // 本類new Keyword("void", VOID), // 無返回值new Keyword("const" , CONST),new Keyword("goto", GOTO), };return kwTable;}/** 判斷字符串是否為關鍵字*/public boolean isKeyWord(String str){boolean b=false;for(int i=0;i<keyW.length;i++){if(keyW[i].getKeyword().equals(str)||keyW[i].getKeyword()==str){b=true;break; }}return b;}} package org.kyc.test1;public class Operators {private String strOperators;private int flagOperators;private Operators[] oper;public Operators(){oper=setOperators();}public Operators(String str,int t){strOperators=str;flagOperators=t;}public String getStrOperators() {return strOperators;}public void setStrOperators(String strOperators) {this.strOperators = strOperators;}public int getFlagOperators() {return flagOperators;}public void setFlagOperators(int flagOperators) {this.flagOperators = flagOperators;}/*** 創建操作符列表* @return Operators[]*/public Operators[] setOperators(){Operators operators[]={new Operators(".",101),new Operators("(",102),new Operators(")",103),new Operators("[",104),new Operators("]",105),new Operators("+",106),new Operators("-",107),new Operators("++",108),new Operators("--",109),new Operators("~",110),new Operators("!",111),new Operators("*",112),new Operators("/",113),new Operators("//",114),new Operators("<<",115),new Operators(">>",116),new Operators(">>>",117),new Operators(">",118),new Operators(">=",119),new Operators("<=",120),new Operators("==",121),new Operators("!=",122),new Operators("&",123),new Operators("|",124),new Operators("?",125),new Operators(":",126),new Operators("=",127),new Operators("+=",128),new Operators("-=",129),new Operators("/=",130),new Operators("%=",131),new Operators("&=",132),new Operators("|=",133),new Operators("^=",134),new Operators("<<=",135),new Operators(">>=",136),new Operators(">>>=",137),new Operators(";",140),new Operators("{",141),new Operators("}",142),new Operators("\"",143),new Operators("\'",144),new Operators("@",145),new Operators("$",146),new Operators("\\",147),new Operators(",",148)};return operators;}public boolean isOperator(String str){// 判斷字符是否是操作符boolean b=false;for(int i=0;i<oper.length;i++){if(oper[i].getStrOperators().equals(str)||oper[i].getStrOperators()==str){b=true;break;}}return b;}public boolean isOperator(char c){// 判斷字符是否是操作符boolean b=false;for(int i=0;i<oper.length;i++){if(oper[i].getStrOperators().equals(c)||oper[i].getStrOperators().charAt(0)==c){b=true;break;}}return b;}public int getNumber(String str){//返回與字符對應的數字int f=0;for(int i=0;i<oper.length;i++){if(oper[i].getStrOperators().equals(str)||oper[i].getStrOperators()==str){f=oper[i].getFlagOperators();break;}}return f;}public int getNumber(char c){int f=0;for(int i=0;i<oper.length;i++){if(oper[i].getStrOperators().equals(c)||oper[i].getStrOperators().charAt(0)==c){f=oper[i].getFlagOperators();break;}}return f;} }package org.kyc.test1;import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException;public class CharacterAnalysis {final int ERROR=0;//錯誤final int LETTER=1;//字母final int NUM=2;//數字final int NOTE=3;//注釋的private char[] prog;//存儲所掃描的程序private int progIndex;//掃描的下標private String token;//獲取到的字符串final int PROG_SIZE = 1000000;// 將關鍵字的外部表示,和內部表示保存在一個名為KeyWordTable的表中Keyword keyword=new Keyword();Keyword keywordTable[] =keyword.setKeywordList();Operators operator=new Operators();Operators operatorsTable[]=operator.setOperators();Object [][] list=new Object[65635][2];int List_index=0;public CharacterAnalysis(File file_choosed) throws IOException {//實現將文件中的字符存到數組中char tempbuf[] = new char[PROG_SIZE];int size=0;try {FileReader fr = new FileReader(file_choosed);BufferedReader br = new BufferedReader(fr);size = br.read(tempbuf, 0, PROG_SIZE);fr.close();} catch (FileNotFoundException exc) {System.out.print("沒有找到該文件!");}if (size != -1) {prog = new char[size];System.arraycopy(tempbuf, 0, prog, 0, size); }}public void Analyse(String str){this.prog=str.toCharArray();try {Analyse();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void Analyse() throws IOException {// 對代碼掃描do {token = "";// 跳過空格符while(isSpaceOrTab(prog[progIndex])||isnextline(prog[progIndex])){while (isSpaceOrTab(prog[progIndex])){progIndex++;if(progIndex>=prog.length)break;}// 處理換行while (isnextline(prog[progIndex])) {progIndex ++;if(progIndex>=prog.length)break;}if(progIndex>=prog.length)break;}if(progIndex>=prog.length){break;}/** 判斷是否為注釋,并作處理*/else if(isMark()){System.out.println("注釋:"+token+" "+NOTE);AddTolist("注釋:"+token,NOTE);continue;}/** 是一個操作符,或者是運算符*/else if (operator.isOperator(prog[progIndex])) {//System.out.println("是個操作符");token += prog[progIndex];progIndex++;//繼續判斷是否為兩個符號組成在一起的操作符if (operator.isOperator(prog[progIndex])){//判端接下來的操作符是否和前面的操作符能夠組成在一起token += prog[progIndex];progIndex++;if (operator.isOperator(token)){//說明組成在一起了System.out.println(token+" "+operator.getNumber(token));AddTolist(token,operator.getNumber(token));continue;}else{//說明組不到一起System.out.println(token.charAt(0)+" "+operator.getNumber(token.charAt(0)));System.out.println(token.charAt(1)+" "+operator.getNumber(token.charAt(1)));AddTolist(token.charAt(0),operator.getNumber(token.charAt(0)));AddTolist(token.charAt(1),operator.getNumber(token.charAt(1)));continue;}}else{System.out.println(token+" "+operator.getNumber(token));AddTolist(token,operator.getNumber(token));continue;}} /** 是一個字符變量*/else if (Character.isLetter(prog[progIndex])) {while (Character.isLetterOrDigit(prog[progIndex])||prog[progIndex]=='_') {//System.out.println("是個字符變量");token += prog[progIndex];progIndex++;if (progIndex >= prog.length)break;}if (keyword.isKeyWord(token)){//說明是關鍵字for(int i=0;i<keywordTable.length;i++){if(token.equals(keywordTable[i].getKeyword())||token==keywordTable[i].getKeyword()){System.out.println(token+" "+keywordTable[i].getKeywordindex());AddTolist(token,keywordTable[i].getKeywordindex());break;}}}else{System.out.println(token + " " + LETTER);AddTolist(token, LETTER);}} /** 是一個數字字符*/else if (Character.isDigit(prog[progIndex])) {while (Character.isDigit(prog[progIndex])) {token += prog[progIndex];progIndex++;if (progIndex >= prog.length)break;}System.out.println(token + " " +NUM );AddTolist(token, NUM);}else {System.out.println(token+" "+ERROR);AddTolist(token, ERROR);progIndex++;continue;}} while (progIndex != prog.length);System.out.println("程序分析完畢");}private boolean isMark() {// TODO Auto-generated method stub//判斷是否為注釋部分if(prog[progIndex]=='/'&&prog[progIndex+1]=='/'){while(!isnextline(prog[progIndex])){token += prog[progIndex];progIndex++;}return true;}return false;}//判斷是否為空格private boolean isSpaceOrTab(char c) {if (c == ' ' || c == '\t')return true;return false;}//判斷是否為換行private boolean isnextline(char c){if(c== '\r'||c == '\n'){return true;}else{return false;}}public char[] getProg() {return prog;}public void AddTolist(String str,int num){list[List_index][0]=str;list[List_index][1]=num;List_index++;}private void AddTolist(char charAt, int num) {// TODO Auto-generated method stublist[List_index][0]=charAt;list[List_index][1]=num;List_index++;} }
package org.kyc.test1;
package org.kyc.test1;import java.awt.EventQueue; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException;import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.border.EmptyBorder; import java.awt.Font;/*** 編譯原理實驗一——詞法分析器* @author 康雨城* 2015/6/4*/ public class View extends JFrame {private JPanel contentPane;private JFileChooser fc;private JTextArea textArea;private CharacterAnalysis ob;private JTable table;private File file_choosed;String [] cloumnNames= {"詞語","分析結果"};/*** Launch the application.*/public static void main(String[] args) {EventQueue.invokeLater(new Runnable() {public void run() {try {View frame = new View();frame.setVisible(true);frame.setTitle("詞法分析器");} catch (Exception e) {e.printStackTrace();}}});}/*** Create the frame.*/public View() {setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100, 100, 750, 400);contentPane = new JPanel();contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));setContentPane(contentPane);contentPane.setLayout(new GridLayout(1, 2, 0, 0));fc = new JFileChooser();fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);JPanel panel = new JPanel();contentPane.add(panel);panel.setLayout(null);JPanel panel_Left = new JPanel();panel_Left.setBounds(0, 297, 362, 54);panel.add(panel_Left);panel_Left.setLayout(new GridLayout(1, 2, 0, 0));JScrollPane Left_ScrollPane = new JScrollPane();Left_ScrollPane.setBounds(0, 0, 362, 297);panel.add(Left_ScrollPane);textArea = new JTextArea();Left_ScrollPane.setViewportView(textArea);JScrollPane RightScrollPane = new JScrollPane();contentPane.add(RightScrollPane);JButton btnSelectFile = new JButton("選取文件");btnSelectFile.setFont(new Font("宋體", Font.BOLD, 18));btnSelectFile.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {int i=fc.showOpenDialog(null);if(i==fc.APPROVE_OPTION){file_choosed = fc.getSelectedFile();try {ob = new CharacterAnalysis(file_choosed);textArea.setText(String.valueOf(ob.getProg()));} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} }else {System.out.println("沒有選擇文件");}}});panel_Left.add(btnSelectFile);JButton btnAnalysis = new JButton("分析");btnAnalysis.setFont(new Font("宋體", Font.BOLD, 18));btnAnalysis.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {try {if(file_choosed==null){System.out.println("請選擇文件!");}else{ob.Analyse(); table=new JTable(ob.list,cloumnNames);RightScrollPane.setViewportView(table);table.invalidate();}} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}});panel_Left.add(btnAnalysis);} }
總結
以上是生活随笔為你收集整理的编译原理——词法分析器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三路归并排序
- 下一篇: JDeodorant 的使用