ก่อนอื่นมาดูเซ็กเมนต์รหัสที่เราต้องการวิเคราะห์ดังนี้:
ผลลัพธ์ผลลัพธ์มีดังนี้:
ผลลัพธ์ผลลัพธ์ (a) .png
ผลลัพธ์ผลลัพธ์ (b) .png
ผลลัพธ์ผลลัพธ์ (c) .png
มีนิพจน์ไบนารีในวงเล็บ: (การเข้ารหัสหมวดหมู่คำ, หมายเลขตำแหน่งคำ)
รหัสมีดังนี้:
แพ็คเกจ yue.lexicalanalyzer; นำเข้า java.io.*;/** โปรแกรมหลัก*/คลาสสาธารณะชั้นหลัก {โมฆะสาธารณะคงที่หลัก (สตริง [] args) พ่น IOException {lexer lexer = lexer ใหม่ (); Lexer.printtoken (); Lexer.printsymbolstable (); - แพ็คเกจ yue.lexicalanalyzer; นำเข้า java.io.*; นำเข้า Java.util.*;/**การวิเคราะห์คำศัพท์และเอาท์พุท*/ชั้นเรียนสาธารณะ lexer {/*หมายเลขบรรทัดบันทึก*/บรรทัด int คงที่สาธารณะ = 1; /*จัดเก็บอักขระอ่านล่าสุด*/ char charact = ''; /*คำสำรอง*/ hashtable <string, keyword> keywords = new hashtable <string, keyword> (); /*ลำดับโทเค็น*/ arraylist ส่วนตัว <Token> tokens = new ArrayList <token> (); /*ตารางสัญลักษณ์*/ Private ArrayList <Symbol> symtable = new ArrayList <Symbol> (); /*อ่านตัวแปรไฟล์*/ bufferedReader reader = null; /*บันทึกว่าตอนจบของไฟล์ถูกอ่าน*/ บูลีนส่วนตัว isend = false; /*ไม่ว่าจะเป็นจุดสิ้นสุดของไฟล์*/ บูลีนสาธารณะ getReaderState () {return this.isend; }/*ลำดับโทเค็นพิมพ์*/โมฆะสาธารณะ printToken () พ่น IOException {fileWriter Writer = ใหม่ fileWriter ("e: //lex.txt"); System.out.println ("ผลการวิเคราะห์คำศัพท์มีดังนี้:"); System.out.print ("du yue-2015220201031/r/n/n"); Writer.write ("du yue-2015220201031/r/n/r/n"); ในขณะที่ (getReaderState () == false) {token tok = scan (); string str = "line" + tok.line + "/t (" + tok.tag + "," + tok.pos + ")/t/t" + tok.name + ":" + tok.toString () + "/r/n"; Writer.write (Str); System.out.print (Str); } writer.flush (); }/*พิมพ์ตารางสัญลักษณ์*/โมฆะสาธารณะ printsymbolstable () พ่น IOException {fileWriter Writer = ใหม่ fileWriter ("e: //symtab1.txt"); System.out.print ("/r/n/r/n ตารางสัญลักษณ์/r/n"); System.out.print ("หมายเลข/t หมายเลขบรรทัด/t ชื่อ/r/n"); Writer.Write ("Symbol Table/R/N"); writer.write ("number" + "/t หมายเลขบรรทัด" + "/t ชื่อ/r/n"); ตัววนซ้ำ <ymbol> e = symtable.iterator (); ในขณะที่ (e.hasnext ()) {สัญลักษณ์สัญลักษณ์ = e.next (); String desc = symbol.pos + "/t" + symbol.line + "/t" + symbol.toString (); System.out.print (desc + "/r/n"); writer.write (desc + "/r/n"); } writer.flush (); }/*การพิมพ์ข้อผิดพลาด*/Public Void Printerror (Token Tok) พ่น IOException {FileWriter Writer = FileWriter ใหม่ ("E: //error.txt"); System.out.print ("/r/n/r/n ข้อผิดพลาดพจนานุกรมมีดังนี้:/r/n"); Writer.write ("ข้อผิดพลาดพจนานุกรมมีดังนี้: /r /n"); string str = "line" + tok.line + "/t (" + tok.tag + "," + tok.pos + ")/t/t" + tok.name + ":" + tok.toString () + "/r/n"; Writer.write (Str); } /*เพิ่มคำที่สงวนไว้* / Void Reserve (คำหลัก w) {keywords.put (w.lexme, w); } public Lexer () {/*เริ่มต้นตัวแปรไฟล์อ่าน*/ลอง {reader = ใหม่ bufferedReader (filereader ใหม่ ("e: //input.txt")); } catch (ioexception e) {system.out.print (e); } /*เพิ่มคำที่สงวนไว้* / this.reserve (keyword.begin); this.reserve (keyword.end); this.reserve (keyword.integer); this.reserve (keyword.function); this.reserve (keyword.read); this.reserve (keyword.write); this.reserve (keyword.aif); this.reserve (keyword.athen); this.reserve (keyword.aelse); } /*อ่านโดยอักขระ* / โมฆะสาธารณะ readch () พ่น IOException {ตัวละคร = (char) reader.read (); if ((int) อักขระ == 0xffff) {this.isend = true; }} /*ตัดสินว่ามันตรงกับ* / public boolean readch (char ch) โยน ioexception {readch (); if (this.character! = ch) {return false; } this.character = ''; กลับมาจริง; } /*การรับรู้ตัวเลข* / บูลีนสาธารณะ isDigit () พ่น IOException {ถ้า (character.isdigit (อักขระ)) {ค่า int = 0; ในขณะที่ (character.isdigit (อักขระ)) {value = 10 * value + character.digit (อักขระ, 10); readch (); } num n = num ใหม่ (ค่า); n.line = line; tokens.add (n); กลับมาจริง; } return return false; } /*การรับรู้คำที่สงวนไว้และตัวระบุ* / public Boolean isletter () พ่น IOException {ถ้า (charact.isletter (อักขระ)) {StringBuffer sb = new StringBuffer (); /*ก่อนอื่นรับการแยกทั้งหมด*/ ในขณะที่ (charact.isletterordigit (อักขระ)) {sb.append (อักขระ); readch (); } /*ตัดสินว่าเป็นคำที่สงวนไว้หรือตัวระบุ* / string s = sb.toString (); คำหลัก w = คำหลัก get (s); /*ถ้าเป็นคำที่สงวนไว้ W ไม่ควรว่างเปล่า*/ ถ้า (w! = null) {w.line = line; tokens.add (w); } else { /* มิฉะนั้นจะเป็นตัวระบุที่นี่มีข้อความเพิ่มเติมที่บันทึกหมายเลขตัวระบุ* / สัญลักษณ์ SY = สัญลักษณ์ใหม่; เครื่องหมายสัญลักษณ์ = SY; // ใช้เพื่อทำเครื่องหมายบูลีนตัวระบุที่มีอยู่ isRepeat = false; sy.line = line; สำหรับ (สัญลักษณ์ I: symtable) {ถ้า (sy.toString (). เท่ากับ (i.toString ())) {mark = i; isRepeat = true; }} if (! isRepeat) {sy.pos = symtable.size () + 1; symtable.add (sy); } อื่นถ้า (isRepeat) {sy.pos = mark.pos; } tokens.add (sy); } return true; } return return false; } /*การรับรู้สัญลักษณ์* / บูลีนสาธารณะ issign () พ่น IOException {switch (อักขระ) {case '#': readch (); Allend.Allend.line = Line; tokens.add (Allend.Allend); กลับมาจริง; กรณี '/r': ถ้า (readch ('/n')) {readch (); lineend.lineend.line = line; tokens.add (lineend.lineend); บรรทัด ++; กลับมาจริง; } case '(': readch (); delimiter.lpar.line = line; tokens.add (delimiter.lpar); return true; case ')': readch (); delimiter.rpar.line = line; tokens.add (delimiter.rpar); กลับมาจริง; กรณี ';': readch (); delimiter.sem.line = line; tokens.add (delimiter.sem); กลับมาจริง; กรณี '+': readch (); calcword.add.line = line; tokens.add (calcword.add); กลับมาจริง; กรณี '-': readch (); calcword.sub.line = line; tokens.add (calcword.sub); กลับมาจริง; กรณี '*': readch (); calcword.mul.line = line; tokens.add (calcword.mul); กลับมาจริง; กรณี '/': readch (); calcword.div.line = line; tokens.add (calcword.div); กลับมาจริง; กรณี ':': ถ้า (readch ('=')) {readch (); calcword.assign.line = line; tokens.add (calcword.assign); กลับมาจริง; } หยุดพัก; กรณี '>': ถ้า (readch ('=')) {readch (); calcword.ge.line = line; tokens.add (calcword.ge); กลับมาจริง; } หยุดพัก; กรณี '<': ถ้า (readch ('=')) {readch (); calcword.le.line = line; tokens.add (calcword.le); กลับมาจริง; } หยุดพัก; กรณี '!': ถ้า (readch ('=')) {readch (); calcword.ne.line = line; tokens.add (calcword.ne); กลับมาจริง; } หยุดพัก; } return false; } /*ต่อไปนี้เริ่มแยกคำหลักตัวระบุและข้อมูลอื่น ๆ* / โทเค็นสาธารณะสแกน () พ่น IOException {โทเค็นโทค; ในขณะที่ (อักขระ == '') readch (); if (iSdigit () || isSign () || isletter ()) {tok = tokens.get (tokens.size () - 1); } else {tok = โทเค็นใหม่ (อักขระ); เครื่องพิมพ์ (TOK); } RETURN TOK; - แพ็คเกจ yue.lexicalanalyzer;/ * * คลาสแม่โทเค็น */โทเค็นคลาสสาธารณะ {แท็ก int สุดท้ายสาธารณะ; สายสาธารณะสาธารณะ = 1; ชื่อสตริงสาธารณะ = ""; สาธารณะ int pos = 0; โทเค็นสาธารณะ (int t) {this.tag = t; } สตริงสาธารณะ toString () {return "" + (ถ่าน) แท็ก; - แพ็คเกจ yue.lexicalanalyzer;/** การกำหนดหมวดหมู่คำ*/แท็กคลาสสาธารณะ {สาธารณะสุดท้ายคงที่ int เริ่มต้น = 1, // คำที่สงวนไว้สิ้นสุด = 2, // คำที่สงวนไว้จำนวนเต็ม = 3, // ฟังก์ชั่นคำที่สงวนไว้ = 4, // คำที่สงวนไว้ = 5, // 11, // ตัวระบุค่าคงที่ = 12, // ค่าคงที่เพิ่ม = 13, // ตัวดำเนินการ "+" sub = 14, // operator "-" mul = 15, // operator "*" div = 16, // ตัวดำเนินการ "/" le = 18, // ผู้ดำเนินการ "<=" ge = 19, // ผู้ประกอบการ " // ตัวดำเนินการ "(" rpar = 25, // ตัวดำเนินการ ")" sem = 26, // ตัวดำเนินการ ";" line_end = 27, // operator all_end = 28; // ตัวดำเนินการ "#"} แพ็คเกจ yue.lexicalanalyzer;/*** คำที่สงวนไว้*/คำหลักคลาสสาธารณะขยายโทเค็น {สตริงสาธารณะ lexme = ""; คำหลักสาธารณะ (สตริง s, int t) {super (t); this.lexme = s; this.name = "คำที่สงวนไว้"; } Public String ToString () {return this.lexme; } คำหลักสุดท้ายคงที่สาธารณะเริ่มต้น = คำหลักใหม่ ("เริ่มต้น", tag.begin), end = คำหลักใหม่ ("end", tag.end), จำนวนเต็ม = คำหลักใหม่ ("จำนวนเต็ม", tag.integer), function = คำหลักใหม่ ("ฟังก์ชัน", tag.function) คำสำคัญ ("ถ้า", tag.if), athen = คำหลักใหม่ ("จากนั้น", tag.then), aelse = คำหลักใหม่ ("อื่น", tag.else);} แพ็คเกจ yue.lexicalanalyzer;/** ตัวระบุ*/สัญลักษณ์คลาสสาธารณะขยายโทเค็น {สตริงสาธารณะ lexme = ""; สัญลักษณ์สาธารณะ (สตริง s) {super (tag.symbol); this.lexme = s; this.name = "ตัวระบุ"; } Public String ToString () {return this.lexme; - แพ็คเกจ yue.lexicalanalyzer;/*** ผู้ดำเนินการ*/calcword คลาสสาธารณะขยายโทเค็น {สตริงสาธารณะ lexme = ""; calcword สาธารณะ (String s, int t) {super (t); this.lexme = s; this.name = "ตัวดำเนินการ"; } Public String ToString () {return this.lexme; } calcword สุดท้ายคงที่สาธารณะเพิ่ม = new calcword ("+", tag.add), sub = calcword ใหม่ ("-", tag.sub), mul = calcword ใหม่ ("*", tag.mul), div = new calcword ("/", tag.div), le = coldword ใหม่ (" tag.ne), กำหนด = calcword ใหม่ (": =", tag.assign);} แพ็คเกจ yue.lexicalanalyzer;/*** สัญลักษณ์ขอบเขต*/คั่นคลาสสาธารณะขยายโทเค็น {สตริงสาธารณะ lexme = ""; ตัวคั่นสาธารณะ (สตริง s, int t) {super (t); this.lexme = s; this.name = "สัญลักษณ์ขอบเขต"; } Public String ToString () {return this.lexme; } ตัวคั่นสุดท้ายคงที่ LPAR = ตัวคั่นใหม่ ("(", tag.lpar), rpar = ตัวคั่นใหม่ (")", tag.rpar), sem = ตัวคั่นใหม่ (";", tag.sem);} แพ็คเกจ yue.lexicalanalyzer;/*******/คลาสสาธารณะคลาสขยายโทเค็น {ค่า int สุดท้ายสาธารณะ; NUM สาธารณะ (int v) {super (tag.constant); this.value = v; this.name = "คงที่"; } public String toString () {return "" + value; - แพ็คเกจ yue.lexicalanalyzer;/*** จุดสิ้นสุดของอักขระบรรทัด*/คลาสสาธารณะ lineend ขยายโทเค็น {สตริงสาธารณะ lexme = ""; Public Lineend (String S) {super (tag.line_end); this.lexme = s; this.name = "End of Line อักขระ"; } Public String ToString () {return this.lexme; } public Static Final Lineend = New Lineend ("/r/n");} แพ็คเกจ yue.lexicalanalyzer;/*** ตัวละครสิ้นสุด*/คลาสสาธารณะ Allend ขยายโทเค็น {สตริงสาธารณะ lexme = ""; Public Allend (String S) {super (tag.all_end); this.lexme = s; this.name = "end character"; } Public String ToString () {return this.lexme; } สาธารณะคงสุดท้าย Allend Allend = ใหม่ Allend ("#");}สรุป
ฉันจะนอนกับเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะช่วยในการศึกษาหรือทำงานของคุณ หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร