Primeiro, vamos dar uma olhada no segmento de código que queremos analisar o seguinte:
O resultado da saída é o seguinte:
Resultado da saída (a) .png
Resultado da saída (b) .png
Resultado da saída (c) .png
Há uma expressão binária entre colchetes: (codificação da categoria de palavras, número da posição da palavra)
O código é o seguinte:
pacote yue.lexicalanalyzer; importar java.io.*;/** programa principal*/classe pública principal {public static void main (string [] args) lança ioexception {lexer lexer = new lexer (); Lexer.printToken (); Lexer.printSymbolStable (); }} pacote yue.lexicalAnalyzer; importar java.io. /*Armazenamento Os caracteres de leitura mais recentes*/ caractere de char = ''; /*Palavras de reserva*/ hashtable <string, palavra -chave> palavras -chave = new hashtable <string, palavra -chave> (); /*Token Sequence*/ Private ArrayList <Token> tokens = new ArrayList <Token> (); /*Tabela de símbolo*/ Private ArrayList <Symbol> Symtable = new ArrayList <Symbol> (); /*Leia a variável do arquivo*/ BufferredReader Reader = NULL; /*Salve se o final do arquivo é lido atualmente*/ privado boolean isend = false; /*Se o final do arquivo é lido*/ public boolean getReadestate () {return this.isend; }/*Print Tokens Sequence*/public void PrintToken () lança IoException {FileWriter writer = new FileWriter ("e: //lex.txt"); System.out.println ("Os resultados da análise lexical são os seguintes:"); 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"; writer.write (str); System.out.print (str); } writer.flush (); }/*Tabela de símbolo de impressão*/public void printSymbolStable () lança ioexception {fileWriter writer = new FileWriter ("e: //symtab1.txt"); System.out.print ("/r/n/r/n tabela de símbolos/r/n"); System.out.print ("Número do número/t/t Nome/R/N"); writer.write ("tabela de símbolos/r/n"); writer.Write ("número" + "/t Número da linha" + "/t nome/r/n"); Iterador <Symbol> e = symtable.iterator (); while (e.hasnext ()) {símbolo símbolo = e.next (); String desc = símbolo.pos + "/t" + símbolo.Line + "/t" + símbolo.toString (); System.out.print (desc + "/r/n"); writer.write (desc + "/r/n"); } writer.flush (); }/*Erro de impressão*/public void Printerror (token tok) lança ioexception {fileWriter writer = new FileWriter ("e: //error.txt"); System.out.print ("/r/n/r/n erros lexicografia é a seguinte:/r/n"); writer.write ("O erro de lexicografia é o seguinte: /r /n"); String str = "line" + tok.line + "/t (" + tok.tag + "," + tok.pos + ")/t/t" + tok.name + ":" + tok.tostring () + "/r/n"; writer.write (str); } /*Adicione palavras reservadas* / void Reserve (palavra -chave w) {keywords.put (w.lexme, w); } public lexer () {/*Inicialize a variável de arquivo de leitura*/try {reader = new BufferredReader (new FileReader ("e: //input.txt"); } catch (ioexception e) {System.out.print (e); } /*Adicione palavras reservadas* / this.Reserve (Keyword.begin); this.Reserve (palavra -chave.end); this.Reserve (Keyword.integer); this.Reserve (Keyword.Function); this.Reserve (Keyword.read); this.Reserve (Keyword.write); this.Reserve (palavra -chave.aif); this.Reserve (palavra -chave.athen); this.Reserve (palavra -chave.aelse); } /*Lido por caractere* / public void readch () lança ioexception {caractere = (char) leitor.read (); if ((int) caractere == 0xffff) {this.isend = true; }} /*Julgue se corresponde a* / public boolean readch (char ch) lança ioexception {readch (); if (this.Character! = ch) {return false; } this.Character = ''; retornar true; } /*Reconhecimento de números* / public boolean isDigit () lança IoException {if (caractere.isdigit (caractere)) {int value = 0; while (caractere.isdigit (caractere)) {value = 10 * value + caractere.digit (caractere, 10); readch (); } Num n = new num (valor); n.line = linha; tokens.add (n); retornar true; } mais retorna false; } /*Reconhecimento de palavras e identificadores reservados* / public boolean ilsletter () lança IoException {if (caractere.isLetter (caractere)) {StringBuffer sb = new StringBuffer (); /*Primeiro obtenha a divisão inteira*/ while (caractere.isLetterordIgit (caractere)) {sb.append (caractere); readch (); } /*Julgue se é uma palavra reservada ou um identificador* / string s = sb.toString (); Palavra -chave w = palavras -chaves.get (s); /*Se for uma palavra reservada, w não deve estar vazio*/ if (w! = Null) {w.line = line; tokens.add (w); } else { /* Caso contrário, é um identificador, aqui existem declarações adicionais que registram o número do identificador* / símbolo sy = novo (s) símbolo (s); Símbolo mark = sy; // usado para marcar o identificador existente boolean isRepeat = false; sy.line = linha; for (símbolo I: Symtable) {if (sy.toString (). Equals (i.toString ())) {mark = i; isRepeat = true; }} if (! isRepeat) {sy.pos = symtable.size () + 1; Symtable.add (SY); } else if (isRepeat) {sy.pos = mark.pos; } tokens.add (sy); } retornar true; } mais retorna false; } /*Reconhecimento de símbolos* / public boolean Issign () lança IoException {switch (caractere) {case '#': readch (); Allend.allend.line = line; tokens.add (allend.allend); retornar true; case '/r': if (readch ('/n')) {readch (); Lineend.lineend.line = line; tokens.add (lineend.linend); linha ++; retornar true; } case '(': readch (); delimiter.lpar.line = line; tokens.add (delimiter.lpar); retorna true; case ')': readch (); Delimiter.rpar.line = line; tokens.add (delimiter.rpar); retornar true; caso ';': readch (); Delimiter.sem.line = line; tokens.add (delimiter.sem); retornar true; case '+': readch (); Calcword.add.line = line; tokens.add (calcword.add); retornar true; case '-': readch (); Calcword.sub.line = line; tokens.add (calcword.sub); retornar true; case '*': readch (); Calcword.mul.line = line; tokens.add (calcword.mul); retornar true; case '/': readch (); Calcword.div.line = line; tokens.add (calcword.div); retornar true; case ':': if (readch ('=')) {readch (); Calcword.assign.line = line; tokens.add (calcword.assign); retornar true; } quebrar; case '>': if (readch ('=')) {readch (); Calcword.ge.line = line; tokens.add (calcword.ge); retornar true; } quebrar; case '<': if (readch ('=')) {readch (); Calcword.le.line = line; tokens.add (calcword.le); retornar true; } quebrar; case '!': if (readch ('=')) {readch (); Calcword.ne.line = line; tokens.add (calcword.ne); retornar true; } quebrar; } retornar false; } /*O seguinte começa a dividir palavras -chave, identificadores e outras informações* / public token scan () lança ioexception {token tok; while (caractere == '') readch (); if (isDigit () || iSSign () || ilsletter ()) {tok = tokens.get (tokens.size () - 1); } else {tok = novo token (caractere); impressorror (tok); } retornar tok; }} pacote yue.lexicalanalyzer;/ * * Token Classe Parent */Public Class Token {public final int tag; public int line = 1; public string name = ""; public int pos = 0; token público (int t) {this.tag = t; } public string tostring () {return "" + (char) tag; }} pacote yue.lexicalanalyzer;/** categoria de palavra atribuição*/public class tag {public final static int = 1, // word reservado end = 2, // word reservado Inteiro = 3, // Função de palavra reservada = 4, // Word Reservado Read = 5, // Word Reservado = 6, // Palavra Reservada se = 7, // 11, // constante de identificador = 12, // constante add = 13, // Operador "+" sub = 14, // operador "-" mul = 15, // operador "*" div = 16, // operador "/" le = 18, // operador "<=" ge = 19, // operador = "/" nes = 20, // operador "! // operador "(" rpar = 25, // operator ")" SEM = 26, // Operator ";" Line_end = 27, // operador all_end = 28; // Operador "#"} pacote yue.lexicalAnalyzer;/*** palavras reservadas*/public class Pordas -chave estende o token {public string lexme = ""; palavra -chave public (string s, int t) {super (t); this.lexme = s; this.name = "palavras reservadas"; } public string tostring () {return this.lexme; } public static final Palavra -chave BEGN = new Keyword ("BEGIN", TAG.BEGIN), END = NOVA PALAVRA -CHAVE (END ", TAG.END), INTEGER = NOVA PORDE DE CHAVE (" Inteiro ", Tag.Integer), Function = New Keyword (" Função ", Tag.function), Read = New Keyword (" read ", Tag. Palavra -chave ("se", tag.if), Athen = nova palavra -chave ("então", tag.then), aelse = nova palavra -chave ("else", tag.else);} pacote yue.lexicalanalyzer;/** identificador*/símbolo de classe pública estende o 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; }} pacote yue.lexicalanalyzer;/*** operador*/public classe calcword estende o token {public string lexme = ""; calcword público (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 = ge = Tag.ne), atribuir = new calcword (": =", tag.assign);} pacote yue.lexicalanalyzer;/*** símbolo limite*/divulitador de classe pública estende o token {public string lexme = ""; public delimiter (String S, int t) {super (t); this.lexme = s; this.name = "símbolo limite"; } 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);} pacote yue.lexicalanalyzer;/** constante*/classe pública num estende o token {public final int value; public num (int v) {super (tag.constant); this.value = v; this.name = "constante"; } public string tostring () {return "" + value; }} pacote yue.lexicalAnalyzer;/*** Final dos caracteres da linha*/public class lineend estende o token {public string lexme = ""; public lineend (strings s) {super (tag.line_end); this.lexme = s; this.name = "Final da linha caracteres"; } public string tostring () {return this.lexme; } public static final lineend lineend = new lineend ("/r/n");} pacote yue.lexicalanalyzer;/*** caractere final*/classe pública allend estende token {public string lexme = ""; public allend (strings s) {super (tag.all_end); this.lexme = s; this.name = "caractere final"; } public string tostring () {return this.lexme; } public static final allend allend = new allend ("#");}Resumir
Vou dormir com todo o conteúdo deste artigo. Espero que o conteúdo deste artigo seja de ajuda para o seu estudo ou trabalho. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar.