Pertama, mari kita lihat segmen kode yang ingin kami analisis sebagai berikut:
Hasil output adalah sebagai berikut:
Hasil output (a) .png
Hasil output (b) .png
Hasil output (c) .png
Ada ekspresi biner dalam tanda kurung: (pengkodean kategori kata, nomor posisi kata)
Kodenya adalah sebagai berikut:
Paket yue.lexicalAnyzer; impor java.io.*;/** program utama*/kelas publik utama {public static void main (string [] args) melempar ioException {lexer lexer = new lexer (); lexer.printtoken (); lexer.printsymbolstable (); }} Paket yue.lexicalAnyzer; impor java.io.*; impor java.util.*;/**analisis dan output leksikal*/kelas publik lexer {/*Nomor baris rekaman*/baris int statis publik = 1; /*Penyimpanan karakter baca terbaru*/ karakter char = ''; /*Cadangan kata*/ hashtable <string, kata kunci> kata kunci = hashtable baru <string, kata kunci> (); /*Urutan Token*/ Private ArrayList <token> Tokens = ArrayList baru <oken> (); /*Tabel Simbol*/ Private ArrayList <smybol> Symtable = NEW ARRAYLIST <Lymply> (); /*Baca Variabel File*/ BufferedReader Reader = null; /*Simpan apakah akhir file saat ini dibaca*/ private boolean isEnd = false; /*Apakah akhir file dibaca*/ public boolean getReaderState () {return this.isend; }/*Cetak urutan token*/public void printToken () melempar ioException {fileWriter writer = baru fileWriter ("e: //lex.txt"); System.out.println ("Hasil analisis leksikal adalah sebagai berikut:"); System.out.print ("du yue-2015220201031/r/n/n"); writer.write ("du yue-2015220201031/r/n/r/n"); while (getReaderState () == false) {token token = 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 (); }/*Cetak tabel simbol*/public void printsymbolstable () melempar ioException {fileWriter writer = baru fileWriter ("e: //symtab1.txt"); System.out.print ("/r/n/r/n Tabel simbol/r/n"); System.out.print ("Nomor/T Nomor Nomor/T Nama/R/N"); writer.write ("Tabel simbol/r/n"); writer.write ("Nomor" + "/t Nomor baris" + "/t Nama/r/n"); Iterator <smugh> e = symtable.iterator (); while (e.hasnext ()) {simbol simbol = e.next (); String desc = simbol.pos + "/t" + simbol.line + "/t" + simbol.toString (); System.out.print (desc + "/r/n"); writer.write (desc + "/r/n"); } writer.flush (); }/*Cetak kesalahan*/public void printerror (token token) melempar ioException {fileWriter writer = baru fileWriter ("e: //error.txt"); System.out.print ("/r/n/r/n kesalahan leksikografi adalah sebagai berikut:/r/n"); writer.write ("kesalahan leksikografi adalah sebagai berikut: /r /n"); String str = "line" + tok.line + "/t (" + tok.tag + "," + tok.pos + ")/t/t" + tok.name + ":" + tok.tostring () + "/r/n"; writer.write (str); } /*Tambahkan kata -kata yang dipesan* / void reserve (kata kunci w) {kunci kata kunci.put (w.lexme, w); } public lexer () {/*inisialisasi variabel file baca*/coba {reader = new buferedReader (filereader baru ("e: //input.txt")); } catch (ioException e) {System.out.print (e); } /*Tambahkan kata -kata yang dipesan* / this.reserve (kata kunci.begin); this.reserve (kunci kata.end); this.reserve (kunci kata.integer); this.reserve (kunci kata.function); this.reserve (kata kunci.read); this.reserve (kunci kata.write); this.reserve (kata kunci.aif); this.reserve (kata kunci.athen); this.reserve (kunci kata.aelse); } /*Dibaca dengan karakter* / public void readch () melempar ioException {karakter = (char) reader.read (); if ((int) character == 0xffff) {this.isend = true; }} /*Menilai apakah itu cocok* / public boolean readch (char ch) melempar ioException {readch (); if (this.character! = ch) {return false; } this.character = ''; Kembali Benar; } /*Pengakuan angka* / public boolean isDigit () melempar ioException {if (karakter.isDigit (karakter)) {int value = 0; while (karakter.isdigit (karakter)) {value = 10 * value + character.digit (karakter, 10); readch (); } Num n = num baru (nilai); n.line = baris; tokens.add (n); Kembali Benar; } lain mengembalikan false; } /*Pengakuan kata -kata dan pengidentifikasi yang dipesan* / public boolean isletter () melempar ioException {if (karakter.isletter (karakter)) {stringBuffer sb = stringBuffer baru (); /*Pertama dapatkan seluruh split*/ while (karakter.isletterordigit (karakter)) {sb.append (karakter); readch (); } /*Menilai apakah itu kata yang dipesan atau pengidentifikasi* / string s = sb.toString (); Kata kunci w = kata kunci.get (s); /*Jika itu kata yang dipesan, w tidak boleh kosong*/ if (w! = Null) {w.line = line; tokens.add (w); } else { /* Jika tidak, itu adalah pengidentifikasi, di sini ada pernyataan tambahan yang merekam nomor pengidentifikasi* / simbol sy = simbol baru (s); Simbol tanda = sy; // Digunakan untuk menandai Identifier Boolean Isrepeat yang ada = false; sy.line = line; untuk (simbol i: symtable) {if (sy.toString (). Equals (i.toString ())) {mark = i; isRepeat = true; }} if (! isRePeat) {sy.pos = symtable.size () + 1; symtable.add (sy); } lain jika (isRePeat) {sy.pos = mark.pos; } tokens.add (sy); } return true; } lain mengembalikan false; } /*Pengenalan simbol* / public boolean isSign () melempar ioException {switch (karakter) {case '#': readch (); Allend.allend.line = line; tokens.add (allend.allend); Kembali Benar; case '/r': if (readch ('/n')) {readch (); Lineend.lineend.line = line; tokens.add (lineend.lineend); garis ++; Kembali Benar; } case '(': readch (); delimiter.lpar.line = line; tokens.add (delimiter.lpar); return true; case ')': readch (); Delimiter.rpar.line = line; tokens.add (Delimiter.rpar); Kembali Benar; case ';': readch (); Delimiter.sem.line = line; tokens.add (Delimiter.sem); Kembali Benar; case '+': readch (); Calcword.add.line = line; tokens.add (calcword.add); Kembali Benar; case '-': readch (); Calcword.sub.line = line; tokens.add (calcword.sub); Kembali Benar; case '*': readch (); Calcword.mul.line = baris; tokens.add (calcword.mul); Kembali Benar; case '/': readch (); Calcword.div.line = line; tokens.add (calcword.div); Kembali Benar; case ':': if (readch ('=')) {readch (); Calcword.assign.line = line; tokens.add (calcword.assign); Kembali Benar; } merusak; case '>': if (readch ('=')) {readch (); Calcword.ge.line = baris; tokens.add (calcword.ge); Kembali Benar; } merusak; case '<': if (readch ('=')) {readch (); Calcword.le.line = line; tokens.add (calcword.le); Kembali Benar; } merusak; case '!': if (readch ('=')) {readch (); Calcword.ne.line = line; tokens.add (calcword.ne); Kembali Benar; } merusak; } return false; } /*Berikut ini mulai membagi kata kunci, pengidentifikasi dan informasi lainnya* / pemindaian token publik () melempar ioException {token token; while (karakter == '') readch (); if (isDigit () || isSign () || isletter ()) {tok = tokens.get (tokens.size () - 1); } else {tok = token baru (karakter); printerror (Tok); } return Tok; }} Paket yue.lexicalAnyzer;/ * * Token Parent Class */Token kelas publik {tag int final publik; baris int int publik = 1; name string publik = ""; POS POS PUBLIK = 0; token publik (int t) {this.tag = t; } public string toString () {return "" + (char) tag; }} package Yue.LexicalAnalyzer;/* * Word category assignment*/public class Tag { public final static int BEGIN = 1, //Reserved word END = 2, //Reserved word INTEGER = 3, //Reserved word FUNCTION = 4, //Reserved word READ = 5, //Reserved word WRITE = 6, //Reserved word IF = 7, //Reserved word THEN = 8, //Reserved word ELSE = 9, //Reserved word SYMBOL = 11, // identifikasi konstanta = 12, // konstanta add = 13, // operator "+" sub = 14, // operator "-" Mul = 15, // operator "*" div = 16, // operator "/" le = 18, // operator "<=" ge = 19, // operator "> =" ne = 20, // operator "! // operator "(" rpar = 25, // operator ")" sem = 26, // operator ";" Line_end = 27, // operator all_end = 28; // operator "#"} Paket yue.lexicalAnyzer;/*** kata -kata yang dicadangkan*/kata kunci kelas publik memperluas token {public string lexme = ""; kata kunci publik (string s, int t) {super (t); this.lexme = s; this.name = "kata -kata cadangan"; } public string toString () {return this.lexme; } public static final KeyWord begin = new KeyWord("begin", Tag.BEGIN), end = new KeyWord("end", Tag.END), integer = new KeyWord("integer", Tag.INTEGER), function = new KeyWord("function", Tag.FUNCTION), read = new KeyWord("read", Tag.READ), write = new KeyWord("write", Tag.WRITE), aIf = new Kata kunci ("if", tag.if), athen = kata kunci baru ("lalu", tag.then), aelse = kata kunci baru ("else", tag.else);} Paket yue.lexicalAnyzer;/** Identifier*/simbol kelas publik memperluas token {public string lexme = ""; simbol publik (string s) {super (tag.symbol); this.lexme = s; this.name = "Identifier"; } public string toString () {return this.lexme; }} Paket yue.lexicalAnyzer;/*** operator*/kelas publik CalcWord memperluas token {public string lexme = ""; public calcWord (String S, int t) {super (t); this.lexme = s; this.name = "operator"; } public string toString () {return this.lexme; } public static final CalcWord add = new CalcWord("+", Tag.ADD), sub = new CalcWord("-", Tag.SUB), mul = new CalcWord("*", Tag.MUL), div = new CalcWord("/", Tag.DIV), le = new CalcWord("<=", Tag.LE), ge = new CalcWord(">=", Tag.GE), ne = new CalcWord("!=", Tag.ne), tetapkan = calcWord baru (": =", tag.assign);} Paket yue.lexicalAnyzer;/*** Simbol terikat*/pembatas kelas publik memperluas token {public string lexme = ""; pembatas publik (string s, int t) {super (t); this.lexme = s; this.name = "simbol terikat"; } public string toString () {return this.lexme; } Public Static Final Delimiter LPAR = New Delimiter ("(", tag.lpar), rpar = new Delimiter (")", tag.rpar), SEM = Delimiter baru (";", tag.sem);} Paket yue.lexicalAnyzer;/** konstanta*/kelas publik NUM meluas token {nilai int final publik; num publik (int v) {super (tag.constant); this.value = v; this.name = "konstan"; } public string toString () {return "" + value; }} Paket yue.lexicalAnyzer;/*** Akhir karakter baris*/lineend kelas publik memperluas token {public string lexme = ""; lineend publik (string s) {super (tag.line_end); this.lexme = s; this.name = "Karakter akhir garis"; } public string toString () {return this.lexme; } lineend lineend final public static = lineend baru ("/r/n");} Paket yue.lexicalAnyzer;/*** Karakter akhir*/kelas publik Allend meluas token {public string lexme = ""; public allend (string s) {super (tag.all_end); this.lexme = s; this.name = "karakter akhir"; } public string toString () {return this.lexme; } public static final allend allend = new allend ("#");}Meringkaskan
Saya akan tidur dengan seluruh konten artikel ini. Saya berharap konten artikel ini akan membantu studi atau pekerjaan Anda. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi.