Primero, echemos un vistazo al segmento de código que queremos analizar de la siguiente manera:
El resultado de salida es el siguiente:
Resultado de salida (a) .png
Resultado de salida (b) .png
Resultado de salida (c) .png
Hay una expresión binaria en los soportes: (codificación de categoría de palabras, número de posición de palabra)
El código es el siguiente:
paquete yue.lexicalAnalyzer; import java.io.*;/** programa principal*/public class Main {public static void main (string [] args) lanza ioexception {lexer lexer = new lexer (); Lexer.printToken (); lexer.printsymbolstable (); }} paquete yue.lexicalAnalyzer; import java.io.*; import java.util.*;/**Análisis léxico y salida*/public class Lexer {/*Record Line Number*/public static int Line = 1; /*Almacenamiento Los últimos caracteres de lectura*/ char carácter = ''; /*Reserve palabras*/ hashtable <string, palabra clave> palabras clave = new Hashtable <String, Keyword> (); /*Secuencia de token*/ private ArrayList <Token> tokens = new ArrayList <Token> (); /*Tabla de símbolos*/ private ArrayList <Symbol> Symtable = New ArrayList <Symbol> (); /*Leer variable de archivo*/ bufferedreader lector = null; /*Guardar si el final del archivo se lee actualmente*/ privado boolean isend = false; /*Si el final del archivo es leída*/ public boolean getReaderState () {return this.Isend; }/*Imprimir secuencia de tokens*/public void printToken () lanza IOException {FileWriter Writer = new FileWriter ("e: //lex.txt"); System.out.println ("Los resultados del análisis léxico son los siguientes:"); 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 = "line" + tok.line + "/t (" + tok.tag + "," + tok.pos + ")/t/t" + tok.name + ":" + tok.ToString () + "/r/n"; escritor.write (str); System.out.print (STR); } escritor.flush (); }/*Tabla de símbolos de impresión*/public void printSymbolStable () lanza IOException {FileWriter Writer = new FileWriter ("e: //symtab1.txt"); System.out.print ("/r/n/r/n Tabla de símbolos/r/n"); System.out.print ("Número/T Número de línea/nombre T/R/N"); escritor.write ("Tabla de símbolos/r/n"); Writer.Write ("Número" + "/T Número de línea" + "/t Nombre/r/n"); Iterador <Symbol> E = Symtable.iterator (); while (e.hasnext ()) {símbolo símbolo = e.next (); Cadena desc = Symbol.Pos + "/t" + Symbol.line + "/t" + Symbol.ToString (); System.out.print (descerm + "/r/n"); Writer.write (Desc + "/r/n"); } escritor.flush (); }/*Imprimir error*/public void Printerror (token tok) lanza IOException {FileWriter Writer = new FileWriter ("e: //error.txt"); System.out.print ("/r/n/r/n La lexicografía es la siguiente:/r/n"); Writer.write ("La lexicografía de error es la siguiente: /r /n"); String str = "line" + tok.line + "/t (" + tok.tag + "," + tok.pos + ")/t/t" + tok.name + ":" + tok.ToString () + "/r/n"; escritor.write (str); } /*Agregar palabras reservadas* / void Reserve (palabra clave w) {keywords.put (w.lexme, w); } public lexer () {/*Inicialice la variable de archivo de lectura*/try {lector = new BufferedReader (new FileReader ("e: //input.txt")); } catch (ioException e) {System.out.print (e); } /*Agregar palabras reservadas* / this.reserve (palabra clave.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 (palabra clave.athen); this.reserve (palabra clave.aelse); } /*Leer por personaje* / public void Readch () lanza ioexception {caracteres = (char) lector.read (); if ((int) caracteres == 0xffff) {this.isend = true; }} /*Juzga si coincide con* / public boolean Readch (char ch) lanza ioexception {readch (); if (this.character! = ch) {return false; } this.character = ''; devolver verdadero; } /*Reconocimiento de números* / public boolean isDigit () lanza ioexception {if (caracteres.isdigit (caracteres)) {int value = 0; while (caracteres.isdigit (caracteres)) {valor = 10 * valor + caracteres.digit (caracteres, 10); readch (); } Num n = nuevo num (valor); N.line = línea; tokens.add (n); devolver verdadero; } else return false; } /*Reconocimiento de palabras e identificadores reservados* / public boolean isletter () lanza ioexception {if (caracteres.isletter (caracteres)) {stringBuffer sb = new StringBuffer (); /*Primero obtenga la división completa*/ while (caracteres.isletterordigit (personaje)) {sb.append (caracteres); readch (); } /*Juzga si es una palabra reservada o un identificador* / string s = sb.ToString (); Palabra clave W = Keywords.get (s); /*Si es una palabra reservada, w no debe estar vacía*/ if (w! = Null) {w.line = line; tokens.add (w); } else { /* de lo contrario es un identificador, aquí hay declaraciones adicionales que registran el número de identificador* / símbolo sy = nuevo símbolo (s); Símbolo Mark = Sy; // se usa para marcar el identificador existente boolean isRrepeat = false; sy.line = línea; para (símbolo I: Symtable) {if (sy.ToString (). Equals (I.ToString ())) {mark = i; isrepeat = true; }} if (! isRepeat) {sy.pos = symtable.size () + 1; simtable.add (sy); } else if (isRpeat) {sy.pos = mark.pos; } tokens.add (sy); } return verdadero; } else return false; } /*Reconocimiento de símbolos* / public boolean issign () lanza ioexception {switch (caracteres) {case '#': readch (); Allend.allend.line = line; tokens.add (Allend.allend); devolver verdadero; case '/r': if (readch ('/n')) {readch (); Lineend.lineend.line = line; tokens.add (lineend.lineend); línea ++; devolver verdadero; } case '(': readch (); delimiter.lpar.line = line; tokens.add (delimiter.lpar); return true; case ')': readch (); Delimiter.rpar.line = line; tokens.add (delimitador.rpar); devolver verdadero; case ';': readch (); Delimiter.sem.line = line; tokens.add (delimitador.sem); devolver verdadero; caso '+': readch (); Calcword.add.line = line; tokens.add (calcword.add); devolver verdadero; caso '-': readch (); Calcword.sub.line = line; tokens.add (calcword.sub); devolver verdadero; caso '*': readch (); Calcword.mul.line = line; tokens.add (calcword.mul); devolver verdadero; case '/': readch (); Calcword.div.line = line; tokens.add (calcword.div); devolver verdadero; case ':': if (readch ('=')) {readch (); Calcword.assign.line = line; tokens.add (calcword.assign); devolver verdadero; } romper; case '>': if (readch ('=')) {readch (); Calcword.ge.line = line; tokens.add (calcword.ge); devolver verdadero; } romper; case '<': if (readch ('=')) {readch (); Calcword.le.line = line; tokens.add (calcword.le); devolver verdadero; } romper; case '!': if (readch ('=')) {readch (); Calcword.ne.line = línea; tokens.add (calcword.ne); devolver verdadero; } romper; } return false; } /*Lo siguiente comienza a dividir las palabras clave, los identificadores y otra información* / public token scan () lanza ioexception {token tok; while (personaje == '' ') readch (); if (isDigit () || isSign () || isletter ()) {tok = tokens.get (tokens.size () - 1); } else {tok = new token (carácter); Printerror (tok); } return tok; }} paquete yue.lexicalAnalyzer;/ * * Token Parent Class */public class token {public final int tag; Public int Line = 1; Nombre de cadena pública = ""; público int pos = 0; Token public (int t) {this.tag = t; } public string toString () {return "" + (char) etiqueta; }} paquete yue.lexicalAnalyzer;/** asignación de categoría de palabras*/public class etiqueta {public final static int begin = 1, // Word reservado End = 2, // Word Integer de palabras reservado = 3, // Función de palabra reservada = 4, // palabra reservada lectura = 5, // Word reservada Write = 6, // Word Reservada If = 7, // luego = 8,/8 Reservado MEDIA = 9, 9, 4, ///////////1 Symole Reservado // identificador constante = 12, // constante add = 13, // operador "+" sub = 14, // operador "-" mul = 15, // operador "*" div = 16, // operador "/" le = 18, // operador "<=" ge = 19, // operador "> =" ne = 20, // operador "! // operador "(" rpar = 25, // operador ")" sem = 26, // operador ";" Line_end = 27, // operador all_end = 28; // operador "#"} paquete yue.lexicalAnalyzer;/*** Palabras reservadas*/Public Class La palabra clave extiende el token {public String LexMe = ""; palabra clave pública (cadena s, int t) {super (t); this.lexMe = S; this.name = "Palabras reservadas"; } public String toString () {return this.lexMe; } Public Static Static Final Keyword Begin = New Keyword ("Begin", tag.begin), end = new Keyword ("end", tag.end), integer = nueva palabra clave ("entero", etiqueta Palabra clave ("if", tag.if), athen = nueva palabra clave ("entonces", etiqueta), aelse = nueva palabra clave ("else", tag.else);} paquete yue.lexicalAnalyzer;/** Identificador*/Símbolo de clase pública extiende token {public String LexMe = ""; símbolo público (String s) {super (tag.symbol); this.lexMe = S; this.name = "identificador"; } public String toString () {return this.lexMe; }} paquete yue.lexicalAnalyzer;/*** operador*/public class Calcword extiende token {public String LexMe = ""; Public CalcWord (String S, Int t) {super (t); this.lexMe = S; this.name = "operador"; } 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 = "" Tag.ne), asignar = new Calcword (": =", tag.assign);} paquete yue.lexicalAnalyzer;/*** Símbolo delimitador*/Public Class Delimiter extiende token {public String lexMe = ""; delimitador público (string s, int t) {super (t); this.lexMe = S; this.name = "Símbolo delimitador"; } public String toString () {return this.lexMe; } public static final delimiter lPAR = new Delimiter ("(", tag.lpar), rpar = new Delimiter (")", tag.rpar), sem = new Delimiter (";", tag.sem);} paquete yue.lexicalAnalyzer;/** constante*/public class num extiende token {public final int value; public Num (int v) {super (tag.constant); this.Value = V; this.name = "constante"; } public String toString () {return "" + valor; }} paquete yue.lexicalAnalyzer;/*** Fin de los caracteres de línea*/public class Lineend extiende token {public String lexMe = ""; public Lineend (String S) {super (Tag.line_end); this.lexMe = S; this.name = "End of Line Characters"; } public String toString () {return this.lexMe; } public static final lineend lineend = new Lineend ("/r/n");} paquete yue.lexicalAnalyzer;/*** Ending carácter*/public class Allend extiende token {public String LexMe = ""; public Allend (String S) {super (Tag.all_end); this.lexMe = S; this.name = "Fin carácter"; } public String toString () {return this.lexMe; } Public estática final Allend Allend = new Allend ("#");}Resumir
Voy a dormir con todo el contenido de este artículo. Espero que el contenido de este artículo sea de ayuda para su estudio o trabajo. Si tiene alguna pregunta, puede dejar un mensaje para comunicarse.