Schauen wir uns zunächst das Codesegment an, das wir wie folgt analysieren möchten:
Das Ausgabeergebnis ist wie folgt:
Ausgangsergebnis (a) .png
Ausgangsergebnis (b) .png
Ausgangsergebnis (c) .png
In Klammern gibt es einen binären Ausdruck: (Wortkategorie Codierung, Wortpositionsnummer)
Der Code ist wie folgt:
Paket yue.lexicalanalyzer; import Java.io. Lexer.printToken (); Lexer.printsymbolstable (); }}
Paket yue.lexicalanalyzer; import Java.io.*; import Java.util. /*Speichern Sie die neuesten Lesezeichen*/ char Zeichen = ''; /*Reserve -Wörter*/ Hashtable <String, Schlüsselwort> Schlüsselwörter = new Hashtable <String, Keyword> (); /*Token -Sequenz*/ private ArrayList <Token> tokens = new ArrayList <Token> (); /*Symbol Tabelle*/ private ArrayList <Symbol> symptable = new ArrayList <Symbol> (); /*Dateivariable lesen*/ bufferedReader reader = null; /*Speichern Sie, ob das Ende der Datei derzeit gelesen wird*/ privat boolean isend = false; /*Ob das Ende der Datei gelesen wird*/ public boolean getReaderState () {return this }/*Print Tokens Sequence*/public void printToken () löscht ioException {filewriter writer = new FileWriter ("e: //lex.txt"); System.out.println ("Lexikalanalyseergebnisse sind wie folgt:"); System.out.print ("du yue-2015220201031/r/n/n"); writer.write ("du yue-2015220201031/r/n/r/n"); while (getReaderState () == false) {token tok = scan (); String str = "Zeile" + Tok.Line + "/t (" + tok.tag + "," + tok.pos + ")/t/t" + tok.name + ":" + tok.toString () + "/r/n"; writer.write (str); System.out.print (str); } writer.flush (); }/*Symboltabelle drucken*/public void printsymbolstable () löscht ioException {filewriter writer = new FileWriter ("e: //symtab1.txt"); System.out.print ("/r/n/r/n Symbol Tabelle/r/n"); System.out.print ("Nummer/t Zeilennummer/t Name/r/n"); writer.write ("Symbol Tabelle/r/n"); writer.write ("number" + "/t Zeilennummer" + "/t name/r/n"); Iterator <Symbol> e = symptable.iterator (); while (e.hasnext ()) {symbol = 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 (); }/*Druckfehler*/public void Printerror (Token -Tok) löst IOException aus {FileWriter writer = new FileWriter ("e: //error.txt"); System.out.print ("/r/n/r/n Fehler Lexikographie ist wie folgt:/r/n"); writer.write ("Fehlerlexikographie lautet wie folgt: /r /n"); String str = "Zeile" + Tok.Line + "/t (" + tok.tag + "," + tok.pos + ")/t/t" + tok.name + ":" + tok.toString () + "/r/n"; writer.write (str); } /*Reservierte Wörter hinzufügen* / void Reserve (Schlüsselwort w) {keywords.put (W.lexme, w); } public Lexer () {/*initialisieren Sie die Lesendateivariable*/try {reader = new bufferedReader (neuer FileReader ("e: //input.txt"); } catch (ioException e) {System.out.print (e); } /*Reservierte Wörter hinzufügen* / 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.athhen); this.reserve (keyword.aelse); } /*Von Charakter gelesen* / public void Readch () löst ioException {charakter = (char) reader.read () aus; if ((int) Zeichen == 0xffff) {this.isend = true; }} /*Beurteilen, ob es übereinstimmt* / public boolean readch (char ch) löst ioException {readch () aus; if (this.character! = ch) {return false; } this.character = ''; zurückkehren; } /*Erkennung von Zahlen* / public boolean isDigit () löst IOException {if (charakter.isDigit (Zeichen)) {int value = 0; while (charakter.isDigit (Zeichen)) {value = 10 * value + Zeichen. Digit (Zeichen, 10); Readch (); } Num n = neue num (Wert); N.Line = Linie; tokens.add (n); zurückkehren; } sonst return false; } /*Erkennung von reservierten Wörtern und Bezeichnern* / public boolean iSeter () löst ioException {if (Zeichen.Isletter (Zeichen)) {StringBuffer sb = new StringBuffer (); /*Erinnern Sie den gesamten Split*/ while (Zeichen. Readch (); } /*Beurteilen, ob es sich um ein reserviertes Wort oder ein Bezeichner handelt* / String s = sb.toString (); Schlüsselwort w = keywords.get (s); /*Wenn es sich um ein reserviertes Wort handelt, sollte W nicht leer sein*/ if (w! = Null) {w.line = line; tokens.add (w); } else { /* ansonsten ist es eine Kennung, hier gibt es zusätzliche Anweisungen, die die Identifikator -Nummer* / symbol Sy = neue Symbol (s) aufzeichnen; Symbol Mark = Sy; // Wird verwendet, um den vorhandenen Kenner boolean isRepeat = false zu markieren; sy.line = line; für (Symbol i: symptable) {if (sy.toString (). Equals (i.toString ())) {mark = i; isrepeat = true; }} if (! isRepeat) {sy.pos = symtable.size () + 1; symptable.add (sy); } else if (isRepeat) {sy.pos = mark.pos; } tokens.add (Sy); } Return true; } sonst return false; } /*Symbolerkennung* / public boolean isssign () löscht ioException {switch (Zeichen) {case '#': ReadCh (); Allend.Allend.line = Zeile; tokens.add (Allend.Allend); zurückkehren; case '/r': if (readch ('/n') {readch (); Lineend.lineend.line = line; tokens.add (lineend.lineend); Linie ++; zurückkehren; } case '(': readch (); delimiter.lpar.line = line; tokens.add (delimiter.lpar); reture true; case ')': Readch (); Delimiter.RPAR.LINE = Zeile; tokens.add (delimiter.rpar); zurückkehren; Fall ';': Readch (); Delimiter.sem.line = Zeile; tokens.add (Delimiter.sem); zurückkehren; Fall '+': Readch (); CalcWord.add.line = line; tokens.add (calcWord.add); zurückkehren; Fall '-': Readch (); CalcWord.sub.line = Zeile; tokens.add (calcWord.sub); zurückkehren; Fall '*': Readch (); CalcWord.mul.line = Zeile; tokens.add (calcWord.mul); zurückkehren; Fall '/': Readch (); CalcWord.div.line = Zeile; tokens.add (calcWord.div); zurückkehren; case ':': if (readch ('=')) {readch (); CalcWord.ssign.line = Zeile; tokens.add (calcWord.Assign); zurückkehren; } brechen; case '>': if (readch ('=')) {readch (); CalcWord.ge.line = Zeile; tokens.add (calcWord.ge); zurückkehren; } brechen; Fall '<': if (readch ('=')) {readch (); CalcWord.le.line = line; tokens.add (calcWord.le); zurückkehren; } brechen; case '!': if (readch ('=')) {readch (); CalcWord.ne.line = line; tokens.add (calcWord.ne); zurückkehren; } brechen; } return false; } /*Das Folgende beginnt, Schlüsselwörter, Bezeichner und andere Informationen zu teilen* / public Token scan () löscht ioException {Token -Tok aus; while (charakter == '') readch (); if (isDigit () || isssign () || iSLetter ()) {tok = tokens.get (tokens.size () - 1); } else {tok = new Token (Zeichen); Drucker (Tok); } return tok; }} Paket yue.lexicalanalyzer;/ * * Token Parent Class */Public Class Token {public Final Int Tag; public int line = 1; public String name = ""; public int pos = 0; public token (int t) {this.tag = t; } public String toString () {return "" + (char) tag; }} Paket yue.lexicalanalyzer;/** Wortkategoriezuweisung*/public class Tag {öffentliche endgültige statische int begin = 1, // reserviertes Wort Ende = 2, // reserviertes Wort Integer = 3, // Reserved Word -Funktion = 4, // Reserved Word Read = 5, // Reserved Word Write = 6, // Reserved Word, //. // identifierkonstante = 12, // Konstante add = 13, // operator "+" sub = 14, // operator "-" mul = 15, // operator "*" div = 16, // operator "/" le = 18, // operator "<=" Ge = 19, // Operator ". RPAR = 25, // Operator ")" SEM = 26, // Operator ";" Line_end = 27, // Bediener All_end = 28; // Bediener "#"} Paket yue.lexicalanalyzer;/*** Reservierte Wörter*/Public Class Keyword erweitert Token {public String lexme = ""; public keyword (string s, int t) {super (t); this.lexme = s; this.name = "reservierte Wörter"; } 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). Keyword ("if", tag.if), Athen = new keyword ("dann", tag.then), aelse = new keyword ("else", tag.else);} paket yue.lexicalanalyzer;/** identifier*/public class symbol erweitert token {public String lexme = ""; public symbol (string s) {super (tag.symbol); this.lexme = s; this.name = "identifier"; } public String toString () {return this.lexme; }} Paket yue.lexicalanalyzer;/*** Operator*/Public Class CalcWord erweitert 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 (NEW Word (",", ",", ",", ",", ",", ",". Tag.ne), zuordnung = neuer calcWord (": =", tag.assign);} Paket yue.lexicalanalyzer;/*** Begrenzungssymbol*/Public Class Declimiter erweitert Token {public String lexme = ""; public Gremiter (String s, int t) {Super (t); this.lexme = s; this.name = "Begrenzungssymbol"; } public String toString () {return this.lexme; } public static Final Declimiter LPAR = New DeRimiter ("(", Tag.lPAR), RPAR = New DeRimiter (")", Tag.RPAR), SEM = New Delimiter (";", Tag.Sem);} paket yue.lexicalanalyzer;/** konstant*/public class num erweitert token {public Final int Wert; public num (int v) {super (tag.constant); this.Value = v; this.name = "konstant"; } public String toString () {return "" + value; }} Paket yue.lexicalanalyzer;/*** Ende der Zeilenzeichen*/Public Class Lineend erweitert Token {public String lexme = ""; public lineend (string s) {super (tag.line_end); this.lexme = s; this.name = "Ende der Zeilenzeichen"; } public String toString () {return this.lexme; } public static Final lineend lineend = new lineend ("/r/n");} Paket yue.lexicalanalyzer;/*** Ending Charakter*/Public Class Allend erweitert Token {public String lexme = ""; public Allend (string s) {super (tag.all_end); this.lexme = s; this.name = "Endcharakter"; } public String toString () {return this.lexme; } public static Final Allend Allend = New Allend ("#");}Zusammenfassen
Ich werde mit dem gesamten Inhalt dieses Artikels schlafen. Ich hoffe, dass der Inhalt dieses Artikels für Ihr Studium oder Ihre Arbeit hilfreich sein wird. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen.